Форум сайта python.su
Доброго дня.
Очень интересная задача.
К примеру со списка надо удалить числа кратніе 3, 7, 8.
На Яве рализовывал с помощью итераторов…
Спасибо.
Офлайн
>>> 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)
Офлайн
например так
>>> 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]
Офлайн
Получется что мы везде генерируем новый список.
А если список объектов, который занимает достаточно много места в памяти.
Можно реализовать,что-то похожее?
or(Iterator iter = tmpLinkedList.iterator(); iter.hasNext() {
if (test(iter.next)) { iter.remove(); }
}
Спасибо, Ваши варианты мне подходят.
Офлайн
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
Отредактировано (Март 19, 2011 12:40:29)
Офлайн
Кстати, генератор можно получить и без 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)
Офлайн
А почему никто не предлагает удаление inplace, с помощью delete?
Отредактировано (Март 19, 2011 21:15:28)
Офлайн
Можно сделать и 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
Офлайн