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

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

28.02.2012, 14:08. Просмотров 3109. Ответов 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
объясните, пожалуйста, что не так, если не затруднит
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2012, 14:08
Ответы с готовыми решениями:

Дан одномерный массив числовых значений, насчитывающий N элементов. Исключить из массива элементы, принадлежащие промежутку [В;С]
Пожалуйста, помогите бедному студенту, в тяжкие времена зачетной недели: ...

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

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

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

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

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
Эксперт С++
5786 / 3435 / 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
Эксперт С++
5786 / 3435 / 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
210 / 195 / 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 / 3255 / 455
Регистрация: 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
210 / 195 / 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 / 3255 / 455
Регистрация: 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
210 / 195 / 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 / 3255 / 455
Регистрация: 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

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

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

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


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

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

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