121 votes

L'appel du filtre renvoie l'objet <filtre à ... >

J'apprends le concept des 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 reçois un message comme celui-ci.

<filter object at 0x00FDC550>

Qu'est-ce que cela signifie ? Cela signifie-t-il que l'objet que j'ai filtré, c'est-à-dire la liste à sortir, est stocké à cet emplacement de la mémoire ? Comment puis-je obtenir la liste dont j'ai besoin ?

206voto

mgilson Points 92954

Il semble que vous utilisiez python 3.x. Dans python3, filter , map , zip etc. renvoient un objet qui est itérable, 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 qu'il a été modifié 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 en amont, tant que l'itérateur retourne la même chose qu'une liste pendant l'itération.

Si vous êtes familier avec les compréhensions de listes et les expressions génératrices, le filtre ci-dessus est maintenant (presque) équivalent à ce qui suit 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

24voto

sloth Points 40517

C'est un itérateur retourné par le filtre fonction.

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 fonction for boucle.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X