Filtres en Python3 [dupliquer]

cette question a déjà une réponse ici:

j'apprends le concept de filtres en Python. J'exécute un code simple comme celui-ci.

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

mais au lieu d'obtenir une liste, je je reçois un message de ce genre.

<filter object at 0x00FDC550>

Qu'est-ce que cela signifie? Cela signifie-t-il que mon objet filtré I. la liste à sortir est stockée dans cette mémoire? Comment puis-je obtenir la liste dont j'ai besoin?

81
demandé sur mgilson 2012-09-07 17:25:22

2 réponses

on dirait que vous utilisez python 3.x. En python3, filter , map , zip , etc renvoie un objet qui est itérable, mais pas une liste. En d'autres termes,

filter(func,data) #python 2.x

est l'équivalent de:

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

je pense qu'il 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, aussi longtemps que l'itérateur renvoie la même chose une liste au cours de 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 à ce qui suit en python3.x:

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

par opposition à:

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

en python 2.x

133
répondu mgilson 2012-09-07 13:37:24

c'est un itérateur retourné par la fonction filtre .

Si vous voulez une liste, il suffit de faire

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

Néanmoins, vous pouvez simplement itérer sur cet objet avec une boucle for .

for e in filter(f, range(2, 25)):
    do_stuff(e)
19
répondu sloth 2012-09-07 13:26:27