Filtros en Python3 [duplicar]


Esta pregunta ya tiene una respuesta aquí:

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

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

Pero en lugar de obtener una lista, estoy recibiendo un mensaje como este.

<filter object at 0x00FDC550>

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

Author: mgilson, 2012-09-07

2 answers

Parece que estás usando python 3.x. En python3, filter, map, zip, etc devuelve un objeto 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 se cambió porque (a menudo) quieres hacer el filtrado en un sentido perezoso't No necesitas consumir toda la memoria para crear una lista por adelantado, siempre y cuando el iterador devuelva lo mismo que una lista durante la iteración.

Si está familiarizado con la lista comprensiones y expresiones generadoras, el filtro anterior es ahora (casi) equivalente al siguiente en python3.x:

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

A diferencia de:

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

En python 2.x

 133
Author: mgilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-07 13:37:24

Es un iterador devuelto por la función filter.

Si desea una lista, simplemente haga

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

Sin embargo, puede iterar sobre este objeto con un bucle for.

for e in filter(f, range(2, 25)):
    do_stuff(e)
 19
Author: sloth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-07 13:26:27