2011-04-07 15 views
9

मैं इस कार्यक्षमता को प्राप्त करने के लिए map और sum का उपयोग करने में सक्षम हूं, लेकिन reduce का उपयोग कैसे करें?पायथन कैसे टुपल की सूची को कम करने के लिए?

2 सूचियां हैं: a, b, उनके पास समान संख्या में मूल्य हैं। मैं

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

गणना करने के लिए काम कर रहे संस्करण map का उपयोग कर मैंने लिखा चाहते

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

तो reduce उपयोग करने के लिए कैसे की जाती है? मैंने लिखा:

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

मुझे त्रुटि मिली "TypeError: 'float' object is unsubscriptable"।

क्या कोई इस पर कुछ प्रकाश डाल सकता है?

+1

आपका लैम्ब्डा दो दो-तत्व tuples लेता है। यह आपकी सूची के पहले दो तत्वों को कम करते समय ठीक काम करता है, लेकिन अब अगली कमी आपके लैम्ब्डा (जो एक फ्लोट है) और सूची का अगला तत्व (जो एक ट्यूपल है) के परिणामस्वरूप काम करेगी, और आपका लैम्ब्डा कर सकता है इसे संभाल नहीं है। आपके लैम्ब्डा को एक संख्या और एक ट्यूपल लेने की आवश्यकता है, और प्रारंभिक मूल्य के साथ संख्या को बीज करें (जैसे एंटोनकोस का जवाब करता है)। – dfan

उत्तर

9

लैम्ब्डा समारोह के पहले तर्क राशि अब तक है और दूसरा तर्क तत्वों की अगली जोड़ी है:

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

कमाल !!! धन्यवाद!! मुझे बहुत मदद करो! –

+0

>>> योग (एक [:] * बी [:]) भी – chrisg

7

मैं इसे इस तरह से करना होगा (मैं तुम्हें लैम्ब्डा की जरूरत नहीं लगता है) ...

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

यह थोड़ा और स्पष्ट लगता है। ज़िप एबी, उन्हें गुणा करें, और शर्तों को पूरा करें।

+0

+1 काम करता है, हालांकि 'x (y * x के लिए x, y ज़िप (ए, बी) में) भी ठीक होगा – eumiro

+0

@eumiro : वास्तव में, धन्यवाद –

7

एक समाधान reduce और map का उपयोग कर, हो सकता है जब आप गलत नक्शा है को कम करने के साथ

from operator import add,mul 

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

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

कठिनाइयाँ।

की अभिव्यक्ति लेते हैं: value = sum(map(lambda (x,y): x*y, zip(a, b)))

मानचित्र परिवर्तन है। हमें tuples को सरल फ्लैट मानों में परिवर्तित करने की आवश्यकता है। आपके मामले में यह कैसा दिखाई देगा:

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

और फिर, अगर आप sumreduce के माध्यम से व्यक्त करना चाहता हूँ - यह दिखेगा की तरह:

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) 
:

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

तो, यहाँ example है

0

ऐसा लगता है कि आप एक आंतरिक उत्पाद चाहते हैं। एक आंतरिक उत्पाद का उपयोग करें।वैक्टर के लिए https://docs.scipy.org/doc/numpy/reference/generated/numpy.inner.html

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

साधारण आंतरिक उत्पाद:

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

उत्पादन: 2

एक बहुआयामी उदाहरण:

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

उत्पादन: सरणी ([[14, 38, 62], [86, 110, 134]])