2009-07-01 13 views
10

En Ruby, estoy acostumbrado a usar Enumerable # inject para revisar una lista u otra estructura y volver con alguna conclusión al respecto. Por ejemplo,Equivalente para inyectar() en Python?

[1,3,5,7].inject(true) {|allOdd, n| allOdd && n % 2 == 1} 

para determinar si cada elemento de la matriz es impar. ¿Cuál sería la forma apropiada de lograr lo mismo en Python?

Respuesta

21

Para determinar si cada elemento es impar, que haría uso de all()

def is_odd(x): 
    return x%2==1 

result = all(is_odd(x) for x in [1,3,5,7]) 

En general, sin embargo, Ruby inject más se parece a reduce() de Python:

result = reduce(lambda x,y: x and y%2==1, [1,3,5,7], True) 

all() se prefiere en este caso, porque podrá escapar del bucle una vez que encuentre un valor similar a False, mientras que el reduce solución tendría que procesar toda la lista para devolver una respuesta.

+4

Tenga en cuenta que la incorporada en el 'reducir()' en Python 2 se ha movido a [ 'functools.reduce()'] (https : //docs.python.org/3.0/library/functools.html#functools.reduce) en Python 3. –

6

Suena como reduce en Python o fold(r|l)'?' de Haskell.

reduce(lambda x, y: x and y % == 1, [1, 3, 5]) 
+0

Siempre me he preguntado por qué catamorphisms se conocen como "doblar" s en todos los idiomas ** ** funcional pero Ruby y Python inventar sus propios nombres ... – ephemient

+0

JavaScript (1.8) utiliza reducir y creo Clojure Los usos también se reducen, pero puedo estar equivocado con el último ... No sé por qué es así. –

+0

Esta es la tradición de Common Lisp, que tomó prestado el nombre de APL. Creo que Ruby y Python tienen mucha más influencia Lisp que desde cualquier lenguaje funcional. –

4

Creo que probablemente desee utilizar all, que es menos general que inject. reduce es el equivalente de Python de inject, sin embargo.

all(n % 2 == 1 for n in [1, 3, 5, 7]) 
Cuestiones relacionadas