2012-09-07 23 views
70

Estoy aprendiendo el concepto de filtros en Python. Estoy ejecutando un código simple como este.Filtros en Python3

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

Pero en vez de conseguir una lista, recibo un mensaje como este.

<filter object at 0x00FDC550> 

¿Qué significa esto? ¿Significa que mi objeto filtrado, es decir, lista para salir, se almacena en esa ubicación de memoria? ¿Cómo obtengo la lista que necesito?

Respuesta

118

Parece que estás usando python 3.x. En python3, filter, map, zip, etc. devuelve un objeto que es iterable, pero no una lista. En otras palabras,

filter(func,data) #python 2.x 

es equivalente a:

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

Creo que fue cambiado debido a que (a menudo) quiere hacer el filtrado en un sentido vago - No es necesario consumir toda la memoria para crear una lista por adelantado, siempre que el iterador devuelva lo mismo que una lista durante la iteración.

Si está familiarizado con las listas por comprensión y expresiones del generador, el filtro anterior es ahora (casi) equivalente a la siguiente en python3.x:

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

A diferencia:

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

en python 2.x

+0

Muchas gracias. Además, ¿puede decirme cuál es este número 0x00FDC550 – user1190882

+3

? Esa es la identificación del objeto. En CPython, es la ubicación de la memoria. – mgilson

+1

wow ... interesante ... pensé que [] snd list() son equivalentes, pero [filter (func, data)] no funciona igual – user2846569

19

Es un iterator devuelto por la función filter.

Si desea una lista, acaba de hacer

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

No obstante, sólo puede iterar sobre este objeto con un bucle for.

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

Muchas gracias. Además, ¿puede decirme cuál es este número 0x00FDC550 – user1190882

+0

? Es la dirección de memoria de ese objeto. Es la salida predeterminada al imprimir un objeto si la clase de ese objeto no tiene las funciones ['__repr__()'] (http://docs.python.org/library/.html # repr) método que se utiliza para controlar el resultado. – sloth