Фильтры в Python3 [дубликат]


этот вопрос уже есть ответ здесь:

Я изучаю концепцию фильтров в Python. Я использую простой код.

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))

но вместо того, чтобы получить список, я получаю сообщение этот.

<filter object at 0x00FDC550>

что это значит? Означает ли это, что мой отфильтрованный объект, т. е. список, который должен выйти, хранится в этом месте памяти? Как мне получить список, который мне нужен?

2 81

2 ответа:

похоже, что вы используете Python 3.x. в python3,filter,map,zip, etc возвращает объект, который является итерационным, но не список. Другими словами,

filter(func,data) #python 2.x

эквивалентно:

list(filter(func,data)) #python 3.x

Я думаю, что это было изменено, потому что вы (часто) хотите сделать фильтрацию в ленивом смысле-вам не нужно потреблять всю память, чтобы создать список спереди, пока итератор возвращает то же самое, что и список во время итерации.

если вы знакомы с пониманием списка и выражениями генератора, приведенный выше фильтр теперь (почти) эквивалентен следующему в python3.x:

( x for x in data if func(x) ) 

против:

[ x for x in data if func(x) ]

в python 2.x

Это итератор возвращено фильтр