NameError: el nombre 'reducir' no está definido en Python

187

Estoy usando Python 3.2. Probé esto:

xor = lambda x,y: (x+y)%2
l = reduce(xor, [1,2,3,4])

Y obtuvo el siguiente error:

l = reduce(xor, [1,2,3,4])
NameError: name 'reduce' is not defined

Intenté imprimir reduceen la consola interactiva. Recibí este error:

NameError: name 'reduce' is not defined


¿ reduceRealmente se elimina en Python 3.2? Si ese es el caso, ¿cuál es la alternativa?

Sergey
fuente
3
@JBernardo, ¿cuál es la herramienta correcta?
Sergey

Respuestas:

280

Fue trasladado a functools.

Ignacio Vazquez-Abrams
fuente
49
@ julio.alegria: Porque Guido lo odia .
Ignacio Vazquez-Abrams
66
El artículo al que se hace referencia en @ IgnacioVazquez-Abrams hace algunos puntos realmente buenos sobre cómo la mayoría de los casos se pueden escribir de una manera más legible. Para mí, es por escrito sum(item['key'] for item in list_of_dicts).
connorbode
195

Puedes añadir

from functools import reduce

antes de usar el reductor.

3 todos los días
fuente
3
El usuario anterior ya respondió la pregunta y la respuesta es la misma que la de su respuesta
Kathiravan Natarajan el
8

O si usas las seis bibliotecas

from six.moves import reduce
Azd325
fuente
3

En este caso, creo que lo siguiente es equivalente:

l = sum([1,2,3,4]) % 2

El único problema con esto es que crea grandes números, pero ¿tal vez eso es mejor que las operaciones de módulo repetidas?

David M
fuente
Las operaciones de módulo repetidas son útiles cuando ayuda a mantener los números pequeños. Sumar números no creará números grandes a menos que sumes MUCHOS números, por lo que en este caso no ayudaría. Especialmente porque no hacerlo permite el uso de la función de suma incorporada, que se ejecutará mucho más rápido que la aplicación repetida de una función definida por el usuario
HackerBoss