2012-10-21 33 views
6

मैं अंतिम वस्तु बनाने के लिए एक सूची में तत्वों का एक गुच्छा जोड़ना चाहता हूं, जिस तरह से ऑब्जेक्ट्स बनाने के समान है। मैं reduce पर एक साधारण विविधता का उपयोग करने की कोशिश कर रहा हूं जहां आप ऐसा करने के लिए एक फ्लैट सूची के बजाय जोड़ों की एक सूची पर विचार करते हैं। मैं की तर्ज पर कुछ करना चाहता हूँ:पाइथन का उपयोग जोड़ों की सूची में कम

nums = [1, 2, 3] 
reduce(lambda x, y: x + y, nums) 

को छोड़कर मैं योग कि संख्या nums की सूची में प्रत्येक तत्व के लिए विशिष्ट है के लिए अतिरिक्त जानकारी जोड़ना चाहते हैं। प्रत्येक जोड़ी (ए, बी) सूची में, के रूप में (ए + बी) योग चलाने के लिए उदाहरण के लिए:

nums = [(1, 0), (2, 5), (3, 10)] 
reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 

यह काम नहीं करता:

>>> reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
TypeError: 'int' object is unsubscriptable 

क्यों यह काम नहीं करता? मुझे पता है कि मैं nums को एक फ्लैट सूची के रूप में एन्कोड कर सकता हूं - यह बात नहीं है - मैं सिर्फ एक कम ऑपरेशन बनाने में सक्षम होना चाहता हूं जो जोड़ों की सूची में पुन: सक्रिय हो सकता है, या एक ही लंबाई की दो सूचियों पर एक साथ और पूल जानकारी से दोनों सूचियां धन्यवाद।

+0

आप एक टपल होने के लिए कम करने का परिणाम चाहते हैं? –

+0

क्या आपको कम उपयोग करना है? मैं सरल योग (x [0] + x [1] को x में x के लिए पसंद करता हूं) – cerealy

उत्तर

6

लैम्ब्डा आप reduce के लिए पारित को देखते हुए:

f = lambda x, y: (x[0]+x[1]) + (y[0]+y[1]) 

f द्वारा दिए गए मान f का एक और मंगलाचरण के लिए एक पैरामीटर के रूप में पारित हो जाएगा। लेकिन f के मानकों को जोड़े होने की उम्मीद है, यह मान int है। आपको यह फ़ंक्शन एक जोड़ी भी वापस करने की आवश्यकता है। उदाहरण के लिए, इस अलग से छोड़ दिया और सही पक्षों योग होगा:

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), nums) 
(6, 15) 

एक और बात आप सूची तत्वों से अलग ढंग से संचित मूल्य का इलाज किया जाता है कर सकते हैं: आप संचित मूल्य एक int कर सकते हैं, जबकि सूची तत्वों जोड़े हैं यदि आप ऐसा करते हैं, तो आप initializer तर्क reduce है, ताकि संचायक एक int को सही तरीके से प्रारंभ है गुजरना होगा:

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda acc, y: acc + y[0] + y[1], nums, 0) 
21 
+0

क्या जोड़ों को कम करने से इटरेटर प्राप्त करने का कोई तरीका है? सूचियों के लिए 'गणना (मेरी सूची) 'के समान कुछ, जहां यह न केवल वर्तमान तत्व बल्कि सूची में इसकी स्थिति भी देता है। क्या 'लम्बाडा' में 'कम करें' उपर्युक्त उदाहरण में उपयोग की जाने वाली जोड़ी की संख्या तक पहुंच प्राप्त कर सकता है? – user248237dfsf

+0

@ user248237 आप 'कम करें' के इनपुट के रूप में 'enumerate (mylist)' का उपयोग कर सकते हैं। – interjay