2011-04-07 22 views
9

Bu işlevselliği elde etmek için map ve sum kullanabiliyorum, ancak reduce nasıl kullanılır?Python, bir tuple listesinde nasıl azaltılabilir?

2 liste var: a, b, aynı sayıda değer var. Ben

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

map kullanarak yazdım çalışma versiyonunu hesaplamak için

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

nasıl ardından reduce kullanmaktır istiyor? Yazdığım:

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

hatasını "TypeError: 'float' object is unsubscriptable" var.

Bu konuda biraz ışık tutabilir mi? (Ben lambda gerek olduğunu sanmıyorum)

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

Lambda'nız iki iki elemanlı tupl alır. Bu, listenin ilk iki unsurunu azaltırken iyi çalışır, ancak şimdi bir sonraki azalma lambda (bir float) ve listenin bir sonraki öğesi (bir tuple) sonucu üzerinde çalışacaktır ve lambda'nız Bunu hallet. Lambda'nızın bir sayı ve bir sayı alması ve sayıyı başlangıç ​​değerine sahip olması gerekir (antonakos'un cevabı gibi). – dfan

cevap

9

lambda işlevinin ilk argümanı şu ana kadar toplamıdır ve ikinci argüman elemanlarının sonraki çiftinin ...

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

Bu da biraz daha açık gibi görünüyor. AB'yi sıkıştırın, bunları çoğaltın ve şartları özetleyin. reduce ve map kullanılarak

+0

müthiş !!! Teşekkürler!! bana çok yardımcı ol! –

+0

>>> toplam (a [:] * b [:]) da – chrisg

7

ben bu şekilde yapardı:

+0

+1 çalışır, ancak toplam (x için x * y x, y, zip (a, b)) 'de iyi olurdu – eumiro

+0

@eumiro : gerçekten, teşekkürler –

7

bir çözüm, yanlış haritayı yaşadığınızda azaltmak ile

from operator import add,mul 

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

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

zorluklar.

en ifadesini alalım: value = sum(map(lambda (x,y): x*y, zip(a, b)))

Harita dönüşümdür. Tuplları basit düz değerlerine dönüştürmek için buna ihtiyacımız var. Eğer sumreduce aracılığıyla ifade etmek istiyorum, sonra

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

Ve - gibi görünecektir:: sizin durumda benzeyecek

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) 
: Yani, burada example olduğunu

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

0

Bir iç ürün istediğiniz gibi görünüyor. bir iç ürün kullanın.Vektörler için https://docs.scipy.org/doc/numpy/reference/generated/numpy.inner.html

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

Olağan iç ürün:

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

çıkışı: 2

Çok boyutlu bir örnek:

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

çıkışı: dizisi ([[14, 38, 62], [86, 110, 134]])