2011-12-31 13 views
85

Estoy usando Python 3.2. Intentado esto:NameError: name 'reduce' no está definido en Python

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 reduce en la consola interactiva - consiguió este error:

NameError: name 'reduce' is not defined 


Es reduce realmente eliminado en Python 3.2 ? Si ese es el caso, ¿cuál es la alternativa?

+3

@JBernardo, ¿cuál es la herramienta adecuada? – Sergey

Respuesta

139

Se movió a functools.

+25

nooooooo! ¿De Verdad? ¿por qué? – juliomalegria

+25

@ julio.alegria: Porque [Guido lo odia] (http://www.artima.com/weblogs/viewpost.jsp?thread=98196). –

+2

El artículo al que se hace referencia en @ IgnacioVazquez-Abrams hace algunos buenos comentarios acerca de cómo la mayoría de los casos se pueden escribir de una manera más legible. Para mí, es escribiendo 'suma (elemento [' clave '] para el elemento en list_of_dicts) '. – connorbode

1

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 operaciones de módulo repetidas?

+0

Esto también es sin duda significativamente más eficiente ... – naught101

+0

Sí ... en un factor de más de 20 para n = 10000 ... – naught101

70

Puede añadir

from functools import reduce 

antes de utilizar la reducen.

+0

El usuario anterior ya ha respondido la pregunta y la respuesta es la misma que la de su respuesta –

1

O si utiliza la biblioteca de seis

from six.moves import reduce 
Cuestiones relacionadas