Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
NikoTrend1
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 3
#1

Из массив числовых значений исключить все нулевые элементы. - Python

28.02.2012, 14:08. Просмотров 2947. Ответов 13
Метки нет (Все метки)

Python
1
2
3
4
5
6
N = input(u"N=")
Massiv = [input(u"Massiv=") for i in range(N)]
for i in range(N):
    if Massiv[i] == 0:
        del Massiv[i]
print Massiv
объясните, пожалуйста, что не так, если не затруднит
http://www.cyberforum.ru/python/thread214145.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2012, 14:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Из массив числовых значений исключить все нулевые элементы. (Python):

Сложение числовых значений одинаковых элементов массива
У меня такая проблема: дан следующий список слов в файле: словосочетание из...

Определить позицию максимального элемента массива, состоящем из числовых значений
Определить позицию максимального элемента массива, состоящем из числовых...

Сумма числовых значений цифр, входящих в текст, равна длине текста
Не могу понять как реализировать это приложение. Программа. В заданный...

Исключить из исходного списка все нулевые элементы до первого отрицательного
Дан список, объектами которого являются целые числа. Размерность списка может...

Сформировать из строк двумерного массива, содержащих нулевые элементы, одномерный массив. Нулевые элементы не выводить (удалить их)
Вот что у меня получилось, но это полная фигня... Помогите пожалуйста! ...

13
bodrich
98 / 88 / 13
Регистрация: 20.06.2010
Сообщений: 964
Записей в блоге: 16
Завершенные тесты: 1
28.02.2012, 14:46 #2
Цитата Сообщение от NikoTrend1 Посмотреть сообщение
объясните, пожалуйста, что не так, если не затруднит
У вас выход за рамки массива

Добавлено через 2 минуты
Можно сделать вот так:
Python
1
2
3
4
N = input("N=")
Massiv = [i for i in range(N)]
Massiv = [x for x in filter(lambda i: i != 0, Massiv)]
print Massiv
1
NikoTrend1
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 3
28.02.2012, 15:15  [ТС] #3
извиняюсь, за неправильно поставленный вопрос. Я хотел как раз понять почему выход за рамки массива?
0
Михаил27
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 20
28.02.2012, 16:28 #4
Python
1
2
3
4
5
6
N = input(u"N=")
Massiv = [input(u"Massiv=") for i in range(N)]
for i in range(N-1):#поскольку диапазон чисел формируемых функцией range(),начинается с "0",то верхней границей должно быть (N-1)
    if Massiv[i] == 0:
        del Massiv[i]
print Massiv
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
28.02.2012, 16:35 #5
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от bodrich Посмотреть сообщение
Massiv = [x for x in filter(lambda i: i != 0, Massiv)]
Python
1
2
Massiv = filter(lambda i: i != 0, Massiv)
# или Massiv = list(filter(lambda i: i != 0, Massiv)) в Python3
NikoTrend1, input использовать во втором питоне — плохо!
3
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
28.02.2012, 17:20 #6
Цитата Сообщение от Михаил27 Посмотреть сообщение
for i in range(N-1):#поскольку диапазон чисел формируемых функцией range(),начинается с "0",то верхней границей должно быть (N-1)
нет, выход за границы массива будет не из-за этого (т.к. range возвращает список/итератор с элементами от 0 до N-1). Выход происходит из-за того, что внутри цикла происходит удаление элементов массива, соответственно, его размер уменьшается (а индексы существующих элементов «сдвигаются»), в то время как диапазон range остается неизменным.
1
Михаил27
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 20
28.02.2012, 17:30 #7
Python
1
2
3
4
5
6
7
N = input("N=")
Massiv = [input("Massiv=")for i in range(N)]#формируем список с єлементов массива
Massiv = filter(lambda i:i!=0,Massiv)#функция filter() вызывает lambda функцию
                                     #для каждого элемента списка и возвращает
                                     #новый список, который содержит только те
                                     #элементы для которых функция возвращает “true”.  
print Massiv
Всем Спасибо огромное!
0
NikoTrend1
0 / 0 / 0
Регистрация: 28.02.2012
Сообщений: 3
28.02.2012, 21:06  [ТС] #8
Михаил27, вот, ещё кому-то пригодился мой вопрос. Спасибо большое, очень ценный форум
0
pyuser
209 / 194 / 63
Регистрация: 26.05.2011
Сообщений: 363
29.02.2012, 05:19 #9
вот так:
Python
1
massiv = [x for x in massiv if x]
будет раза в два-два с половиной быстрее чем:
Python
1
massiv = list(filter(lambda i: i != 0, massiv))
а так:
Python
1
massiv = list(filter(bool, massiv))
и еще быстрее
1
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
01.03.2012, 01:37 #10
Python
1
2
3
4
5
6
7
>>> lst = [1, 2, 0, 3, 4, 0, 6, 7, 0]
>>> while 0 in lst:
...     lst.remove(0)
... 
>>> lst
[1, 2, 3, 4, 6, 7]
>>>
Python
1
2
3
4
>>> lst = [1, 2, 0, 3, 4, 0, 6, 7, 0]
>>> filter(lambda i: i, lst)
[1, 2, 3, 4, 6, 7]
>>>
Добавлено через 19 часов 0 минут
проверил по скорости через timeit
цикл оказался немного быстрее фильтра

думал ускорить цикл
Python
1
2
3
4
5
    try:
        while True:
            del lst[lst.index(0)]
    except ValueError:
        pass
так этот оказался очень медленным, хотя кажется, что в нём один проход всего
1
pyuser
209 / 194 / 63
Регистрация: 26.05.2011
Сообщений: 363
01.03.2012, 04:12 #11
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import timeit
 
if "__main__" == __name__:
    massiv = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    t1 = timeit.Timer("list(filter(lambda i: i != 0, massiv))", "from __main__ import massiv")
    t2 = timeit.Timer("list(filter(lambda i: i, massiv))", "from __main__ import massiv")
    t3 = timeit.Timer("[x for x in massiv if x]", "from __main__ import massiv")
    t4 = timeit.Timer("list(filter(bool, massiv))", "from __main__ import massiv")
    t5 = timeit.Timer("while 0 in massiv: massiv.remove(0)", "from __main__ import massiv")
 
    print(t1.timeit())
    print(t2.timeit())
    print(t3.timeit())
    print(t4.timeit())
    print(t5.timeit())
 
# результат
4.03785138893351
3.6912919100053223
1.7922205196470502
1.4422745767967715
0.2727966822598962
Последней цифрой можно не впечатляться, потому как удаление происходит всего один раз, а остальные 999999 раз просто проверяется отсутствие значения 0 в списке
К чему это все? К тому что применительно к map, filter, reduce и т.д и т.п. lambda - зло.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
01.03.2012, 06:08 #12
в 3.2.2
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
>>> def f1():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     while 0 in lst:
...         lst.remove(0)
... 
>>> 
>>> def f2():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     lst = filter(lambda i: i, lst)
... 
>>> 
>>> def f3():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     lst = list(filter(lambda i: i, lst))
... 
>>> 
>>> import timeit
>>> t1 = timeit.Timer('f1()', 'from __main__ import f1')
>>> t2 = timeit.Timer('f2()', 'from __main__ import f2')
>>> t3 = timeit.Timer('f3()', 'from __main__ import f3')
>>> t1.repeat(5, 2000000)
[2.1868231296539307, 2.1641170978546143, 2.160362958908081, 2.161345958709717, 2.1860971450805664]
>>> t2.repeat(5, 2000000)
[0.8930799961090088, 0.8885161876678467, 0.8892738819122314, 0.8894810676574707, 0.8898909091949463]
>>> t3.repeat(5, 2000000)
[4.382528066635132, 4.374891996383667, 4.3801109790802, 4.384387969970703, 4.3769309520721436]
>>>

в 2.7.2
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
>>> def f1():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     while 0 in lst:
...         lst.remove(0)
... 
>>> 
>>> def f2():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     lst = filter(lambda i: i, lst)
... 
>>> 
>>> def f3():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     lst = list(filter(lambda i: i, lst))
... 
>>> 
>>> import timeit
>>> t1 = timeit.Timer('f1()', 'from __main__ import f1')
>>> t2 = timeit.Timer('f2()', 'from __main__ import f2')
>>> t3 = timeit.Timer('f3()', 'from __main__ import f3')
>>> t1.repeat(5, 2000000)
[2.747403144836426, 2.7279930114746094, 2.732720136642456, 2.7263519763946533, 2.7324111461639404]
>>> t2.repeat(5, 2000000)
[2.6311988830566406, 2.6145389080047607, 2.611593008041382, 2.613178014755249, 2.608211040496826]
>>> t3.repeat(5, 2000000)
[3.1140201091766357, 3.099252939224243, 3.097136974334717, 3.0949201583862305, 3.098599910736084]
>>>

в этот раз получилось, что фильтр немного быстрее цикла

Добавлено через 32 секунды
Цитата Сообщение от pyuser Посмотреть сообщение
К тому что применительно к map, filter, reduce и т.д и т.п. lambda - зло.
это почему, чем она отличается от любой другой функции ?
в 3.2.2
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> def f1():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     lst = filter(lambda i: i, lst)
... 
>>> 
>>> def f2():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     f = lambda i: i
...     lst = filter(f, lst)
... 
>>> 
>>> import timeit
>>> t1 = timeit.Timer('f1()', 'from __main__ import f1')
>>> t2 = timeit.Timer('f2()', 'from __main__ import f2')
>>> t1.repeat(5, 2000000)
[0.8781790733337402, 0.8558759689331055, 0.855961799621582, 0.8574540615081787, 0.8547971248626709]
>>> t2.repeat(5, 2000000)
[0.925865888595581, 0.9157328605651855, 0.9148991107940674, 0.9083690643310547, 0.9189949035644531]
>>>

в 2.7.2
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> def f1():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     lst = filter(lambda i: i, lst)
... 
>>> 
>>> def f2():
...     lst = [0, 1, 0, 2, 0, 3, 0]
...     f = lambda i: i
...     lst = filter(f, lst)
... 
>>> 
>>> import timeit
>>> t1 = timeit.Timer('f1()', 'from __main__ import f1')
>>> t2 = timeit.Timer('f2()', 'from __main__ import f2')
>>> t1.repeat(5, 2000000)
[2.746462821960449, 2.7367570400238037, 2.736837863922119, 2.735177993774414, 2.7364919185638428]
>>> t2.repeat(5, 2000000)
[2.8042149543762207, 2.804452896118164, 2.8055648803710938, 2.8038151264190674, 2.810389995574951]
>>>
0
pyuser
209 / 194 / 63
Регистрация: 26.05.2011
Сообщений: 363
01.03.2012, 07:00 #13
3.2.2
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import timeit
 
def f1():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    lst = list(filter(lambda i: i != 0, lst))
 
def f2():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    lst = list(filter(lambda i: i, lst))
 
def f3():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    lst = [x for x in lst if x]
 
def f4():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    lst = list(filter(bool, lst))
 
def f5():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    while 0 in lst:
        lst.remove(0)
 
if "__main__" == __name__:
    t1 = timeit.Timer("f1()", "from __main__ import f1")
    t2 = timeit.Timer("f2()", "from __main__ import f2")
    t3 = timeit.Timer("f3()", "from __main__ import f3")
    t4 = timeit.Timer("f4()", "from __main__ import f4")
    t5 = timeit.Timer("f5()", "from __main__ import f5")
 
    print(t1.repeat(5))
    print(t2.repeat(5))
    print(t3.repeat(5))
    print(t4.repeat(5))
    print(t5.repeat(5))
результат:
[4.433629902683162, 4.431266124605223, 4.434762239334887, 4.429822714898123, 4.4290299465434835]
[4.158927531292385, 4.166734110061473, 4.151155454114978, 4.156151899193894, 4.15411386083985]
[2.2100820076294596, 2.201466806535471, 2.202594533662797, 2.2032563496198563, 2.19916902846591]
[1.9996699301168164, 1.9988988125585792, 1.9995257777175581, 2.006702877041633, 1.998877720492409]
[2.7012282985686653, 2.7039438671674674, 2.7030073654612607, 2.7018961907169796, 2.70474794980926]

2.7.2
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import timeit
 
def f1():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    lst = filter(lambda i: i != 0, lst)
 
def f2():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    lst = filter(lambda i: i, lst)
 
def f3():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    lst = [x for x in lst if x]
 
def f4():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    lst = filter(bool, lst)
 
def f5():
    lst = [0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9]
    while 0 in lst:
        lst.remove(0)
 
if "__main__" == __name__:
    t1 = timeit.Timer("f1()", "from __main__ import f1")
    t2 = timeit.Timer("f2()", "from __main__ import f2")
    t3 = timeit.Timer("f3()", "from __main__ import f3")
    t4 = timeit.Timer("f4()", "from __main__ import f4")
    t5 = timeit.Timer("f5()", "from __main__ import f5")
 
    print(t1.repeat(5))
    print(t2.repeat(5))
    print(t3.repeat(5))
    print(t4.repeat(5))
    print(t5.repeat(5))
результат:
[3.182125521539749, 3.1846959599613918, 3.186127845857504, 3.1807717181932347, 3.181788746893808]
[2.922457463169202, 2.9248322761691803, 2.9293007910223245, 2.92272167272656, 2.9241533490988374]
[2.008943175738814, 2.0306769435780225, 2.0270821431215467, 2.025234980982219, 2.0289198068469574]
[1.4277082003439006, 1.4253541302037007, 1.4262225366631824, 1.4259784413940864, 1.424696574564642]
[3.0065879881381576, 3.0007290731084524, 3.0116745983078843, 3.0128445095675573, 3.0070067564453]

Не по теме:

Радуемся за функцию remove в третьем питоне


Да практически в каждом букваре пишут, что применительно к map, filter, reduce и т.д и т.п. применение lambda не рентабельно, лучше пользоваться встроенными функциями (если это возможно, конечно), цифры именно об этом и говорят.
1
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
01.03.2012, 10:52 #14
для 3.2.2
Код
[3.3781120777130127, 3.372649908065796, 3.367892026901245, 3.3649561405181885, 3.368501901626587]
[2.979408025741577, 2.9938619136810303, 2.9829039573669434, 2.970508098602295, 2.972170829772949]
[1.2458710670471191, 1.2432608604431152, 1.2466320991516113, 1.2443158626556396, 1.2445659637451172]
[1.3631069660186768, 1.3629310131072998, 1.3609118461608887, 1.360713005065918, 1.359184980392456]
[1.9892570972442627, 1.985692024230957, 1.9907338619232178, 1.9866869449615479, 1.9892690181732178]

для 2.7.2
Код
[2.2540061473846436, 2.3068430423736572, 2.3028430938720703, 2.250349998474121, 2.2451279163360596]
[2.1147079467773438, 2.1094181537628174, 2.1081058979034424, 2.1094841957092285, 2.1090569496154785]
[1.2590408325195312, 1.2776930332183838, 1.2735919952392578, 1.2663419246673584, 1.267894983291626]
[0.9363338947296143, 0.9367589950561523, 0.9370710849761963, 0.9325101375579834, 0.9478399753570557]
[2.4995529651641846, 2.497981071472168, 2.5107169151306152, 2.492464065551758, 2.503059148788452]


Цитата Сообщение от pyuser
лучше пользоваться встроенными функциями
ну, это в данном случае ничего сложного делать не нужно и можно применить bool()
а то, что включение быстро работает, не отменяет занимаемой им памяти
0
01.03.2012, 10:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2012, 10:52
Привет! Вот еще темы с решениями:

Дан массив, содержащий нулевые элементы. “Сожмите” его, передвинув нулевые элементы в конец массива
Знаю, где ошибка, но не могу придумать, как исправить. Если выпадает два...

Исключить из массива нулевые элементы
Исключить из "а" и "в" нолевые элементы. Оставшиеся элементы поместить в массив...

Нужно исключить нулевые элементы из массива
program D; uses crt; var a:array of real; i,n,k:integer; sa:real;...

Сжать массив, выбросив из него все нулевые элементы
Помогите идиоту сжать заданный массив, выбросив из него все нулевые элементы=)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru