2011-04-07 25 views
9

Puedo usar map y sum para lograr esta funcionalidad, pero ¿cómo usar reduce?Python cómo reducir en una lista de tuplas?

Hay 2 listas: a, b, tienen el mismo número de valores. Quiero calcular

a[0]*b[0]+a[1]*b[1]+...+a[n]*b[n] 

La versión de trabajo que escribí usando map está

value = sum(map(lambda (x,y): x*y, zip(a, b))) 

Cómo usar reduce entonces? Escribí:

value = reduce(lambda (x,y): x[0]*y[0] + x[1]*y[1], zip(a, b))) 

Recibí el error "TypeError: 'float' object is unsubscriptable".

¿Alguien puede arrojar algo de luz sobre esto?

+1

Su lambda toma dos tuplas de dos elementos. Eso funciona bien al reducir los primeros dos elementos de su lista, pero ahora la siguiente reducción funcionará en el resultado de su lambda (que es un flotador) y el siguiente elemento de la lista (que es una tupla), y su lambda puede Manejar eso. Su lambda necesita tomar un número y una tupla, y sembrar el número con un valor inicial (como lo hace la respuesta de antonakos). – dfan

Respuesta

9

El primer argumento de la función lambda es la suma hasta el momento y el segundo argumento es el siguiente par de elementos:

value = reduce(lambda sum, (x, y): sum + x*y, zip(a, b), 0) 
+0

¡¡increíble !!! ¡¡Gracias!! ¡ayúdame mucho! –

+0

>>> sum (a [:] * b [:]) también funciona – chrisg

7

lo haría de esta manera (no creo que necesita lambda) ...

sum(x*y for x, y in zip(a, b)) 

Esto también parece un poco más explícito. Zip AB, multiplíquelos y resuma los términos.

+0

+1, aunque 'suma (x * y para x, y en zip (a, b))' también sería correcto – eumiro

+0

@eumiro : de hecho, gracias –

7

Una solución usando reduce y map,

from operator import add,mul 

a = [1,2,3] 
b = [4,5,6] 

print reduce(add,map(mul,a,b)) 
1

Dificultades con reducir suceder cuando se tiene un mapa incorrecto.

Tomemos la expresión: value = sum(map(lambda (x,y): x*y, zip(a, b)))

Mapa es la transformación. Necesitamos que convierta tuplas en simple plano valores. En el caso que se verá así:

map(lambda x: x[0]*x[1], zip(a,b)) 

Y luego, si se quiere expresar sum través reduce - que se verá así:

reduce(lambda x,y: x + y, map) 

lo tanto, aquí es example:

a = [1,2,3] 
b = [4,5,6] 
l = zip(a,b) 
m = map(lambda x: x[0]*x[1], l) 
r = reduce(lambda x,y: x + y, m) 
0

parece que quiere un producto interior. usa un producto interno https://docs.scipy.org/doc/numpy/reference/generated/numpy.inner.html

np.inner(a, b) = sum(a[:]*b[:]) 

producto interno ordinario para los vectores:

a = np.array([1,2,3]) 
b = np.array([0,1,0]) 
np.inner(a, b) 

de salida: 2

Un ejemplo multidimensional:

a = np.arange(24).reshape((2,3,4)) 
b = np.arange(4) 
np.inner(a, b) 

salida: array ([[14, 38, 62], [86, 110, 134]])

Cuestiones relacionadas