web-dev-qa-db-fra.com

Filtres en Python3

J'apprends le concept de filtres en Python. Je cours un code simple comme ceci.

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

Mais au lieu d’obtenir une liste, je reçois un message comme celui-ci.

<filter object at 0x00FDC550>

Qu'est-ce que ça veut dire? Est-ce que cela signifie que mon objet filtré, c'est-à-dire la liste à sortir, est stocké à cet emplacement de mémoire? Comment puis-je obtenir la liste dont j'ai besoin?

102
user1190882

On dirait que vous utilisez python 3.x. En python3, filter, map, Zip, etc., renvoie un objet qui est éditable, mais pas une liste. En d’autres termes,

filter(func,data) #python 2.x

est équivalent à:

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

Je pense que cela a été changé parce que vous voulez (souvent) faire le filtrage dans un sens paresseux - vous n'avez pas besoin de consommer toute la mémoire pour créer une liste à l'avance, tant que l'itérateur renvoie la même chose une liste serait pendant l'itération.

Si vous êtes familier avec les compréhensions de liste et les expressions de générateur, le filtre ci-dessus est maintenant (presque) équivalent au suivant dans python3.x:

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

Par opposition à:

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

dans python 2.x

162
mgilson

C'est un itérateur renvoyé par la fonction filtre .

Si vous voulez une liste, faites juste

list(filter(f, range(2, 25)))

Néanmoins, vous pouvez simplement parcourir cet objet avec une boucle for.

for e in filter(f, range(2, 25)):
    do_stuff(e)
19
sloth