2011-12-31 9 views
85

Sto usando Python 3.2. Provato questo:NameError: il nome 'reduce' non è definito in Python

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

e ha ottenuto il seguente errore:

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

provato la stampa reduce nella console interattiva - ottenuto questo errore:

NameError: name 'reduce' is not defined 


È reduce davvero rimosso in Python 3.2 ? Se è così, qual è l'alternativa?

+3

@JBernardo, qual è lo strumento giusto? – Sergey

risposta

139

È stato spostato a functools.

+25

nooooooo! veramente? perché? – juliomalegria

+25

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

+2

L'articolo a cui si fa riferimento in @ IgnacioVazquez-Abrams offre alcuni punti davvero validi su come la maggior parte dei casi può essere scritta in modo più leggibile. Per me, è scrivendo 'sum (item ['key'] per item in list_of_dicts)'. – connorbode

1

In questo caso credo che la segue è equivalente:

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

L'unico problema di questo è che crea grandi numeri, ma forse è meglio che le operazioni di rollover ripetute?

+0

Anche questo è sicuramente molto più efficiente ... – naught101

+0

Sì ... di un fattore maggiore di 20 per n = 10000 ... – naught101

70

È possibile aggiungere

from functools import reduce 

prima di utilizzare la riducono.

+0

L'utente precedente ha già risposto alla domanda e la risposta è la stessa della sua risposta –

1

Oppure, se si utilizza la libreria di sei

from six.moves import reduce