Уведомления

Группа в Telegram: @pythonsu

#1 Март 19, 2011 01:53:32

likin
От:
Зарегистрирован: 2010-03-15
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Как удалить єлементі со списка в цикле...

Доброго дня.
Очень интересная задача.
К примеру со списка надо удалить числа кратніе 3, 7, 8.
На Яве рализовывал с помощью итераторов…

Спасибо.



Офлайн

#2 Март 19, 2011 02:12:12

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Как удалить єлементі со списка в цикле...

>>> def is378(num):
... if num%3 == 0 or num%7 == 0 or num%8 == 0:
... return False
... return True
...
>>> l = [3,4,5,6,7,2,4,56,8,8,8,9,3,2,1,7]
>>> filter(is378,l)
[4, 5, 2, 4, 2, 1]



Отредактировано (Март 19, 2011 02:18:56)

Офлайн

#3 Март 19, 2011 02:12:14

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Как удалить єлементі со списка в цикле...

например так

>>> test_list = [1,2,3,70,80,22,23,21]
>>> reduced_list = [i for i in test_list if i%3 and i%7 and i%8]
>>> reduced_list
[1, 2, 22, 23]



Офлайн

#4 Март 19, 2011 09:08:09

likin
От:
Зарегистрирован: 2010-03-15
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Как удалить єлементі со списка в цикле...

Получется что мы везде генерируем новый список.
А если список объектов, который занимает достаточно много места в памяти.
Можно реализовать,что-то похожее?
or(Iterator iter = tmpLinkedList.iterator(); iter.hasNext() {
if (test(iter.next)) { iter.remove(); }
}

Спасибо, Ваши варианты мне подходят.



Офлайн

#5 Март 19, 2011 12:39:54

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Как удалить єлементі со списка в цикле...

likin
А если список объектов, который занимает достаточно много места в памяти.
>>> from itertools import ifilter
>>> def is378(num):
... if num%3 == 0 or num%7 == 0 or num%8 == 0:
... return False
... return True
...
>>> l = [3,4,5,6,7,2,4,56,8,8,8,9,3,2,1,7]
>>> ifilter(is378,l)
<itertools.ifilter object at 0x02162D50>
>>> for i in ifilter(is378,l):
... print i
...
4
5
2
4
2
1
ifilter, в отличии от filter, создаст итератор, а не новый список.



Отредактировано (Март 19, 2011 12:40:29)

Офлайн

#6 Март 19, 2011 13:14:31

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Как удалить єлементі со списка в цикле...

Кстати, генератор можно получить и без itertools:

>>> def generator():
... for i in l:
... if not (i%3==0 or i%7==0 or i%8==0):
... yield i
...
>>> mygen = generator()
>>> for i in mygen: print i
...
4
5
2
4
2
1
Ах да, чуть не забыл :)
>>> l = [3,4,5,6,7,2,4,56,8,8,8,9,3,2,1,7]
>>> mygen = (i for i in l if i%3 and i%7 and i%8)
>>> mygen
<generator object <genexpr> at 0x02168E90>
>>> for i in mygen:
... print i
...
4
5
2
4
2
1



Отредактировано (Март 19, 2011 13:34:12)

Офлайн

#7 Март 19, 2011 21:12:13

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Как удалить єлементі со списка в цикле...

А почему никто не предлагает удаление inplace, с помощью delete?



Отредактировано (Март 19, 2011 21:15:28)

Офлайн

#8 Март 23, 2011 14:22:23

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Как удалить єлементі со списка в цикле...

Можно сделать и inplace, только удалять элементы из большого массива совсем неэффективно.

i = 0
while i < len( l ):
if l[i]%3==0 or l[i]%7==0 or l[i]%8==0:
del l[i]
else:
i += 1



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version