2013-01-06 35 views
20

मैं इस के समान tuples की एक सूची है:राशि tuples की एक सूची में प्रत्येक मूल्य

l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)] 

मैं एक सरल एक लाइनर मेरा पीछा परिणाम दे देंगे कि बनाना चाहते हैं:

r = (25, 20) or r = [25, 20] # don't care if tuple or list. 

निम्न कार्य की तरह हो कौन सा होगा:

r = [0, 0] 
for t in l: 
    r[0]+=t[0] 
    r[1]+=t[1] 

मैं इसे बहुत ही सरल कुछ है यकीन है, लेकिन मैं इसके बारे में सोच भी नहीं सकते।

नोट: मैं इसी तरह के सवाल पर पहले से ही देखा:

How do I sum the first value in a set of lists within a tuple?

How do I sum the first value in each tuple in a list of tuples in Python?

+0

संभव डु का उपयोग किए बिना [पाइथन तत्व-वार ट्यूपल ऑपरेशंस की मात्रा] की नकल] (http://stackoverflow.com/questions/497885/python-element-wise-tuple-operations-like-sum) –

+0

@CiroSantilli: यह एक डुप्लिकेट नहीं है। प्रश्न जो आपने लिंक किया है * दो * tuples के साथ काम करता है। Tuples की एक * सूची * के बारे में यह सवाल। समाधान का समाधान आवश्यक हिस्सा है। हालांकि उत्तर दोनों मामलों में लगभग क्रियात्मक काम करते हैं। फिर भी 'ए, बी' tuples और' a_list_of_tuples' अलग हैं (अंतर का खुलासा किया जा सकता है कि कौन सा समाधान सबसे कुशल है)। – jfs

उत्तर

46

उपयोग zip() और sum():

In [1]: l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)] 

In [2]: [sum(x) for x in zip(*l)] 
Out[2]: [25, 20] 

या:

In [4]: map(sum, zip(*l)) 
Out[4]: [25, 20] 

timeit परिणाम:

In [16]: l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)]*1000 

In [17]: %timeit [sum(x) for x in zip(*l)] 
1000 loops, best of 3: 1.46 ms per loop 

In [18]: %timeit [sum(x) for x in izip(*l)]  #prefer itertools.izip 
1000 loops, best of 3: 1.28 ms per loop 

In [19]: %timeit map(sum, zip(*l)) 
100 loops, best of 3: 1.48 ms per loop 

In [20]: %timeit map(sum, izip(*l))    #prefer itertools.izip 
1000 loops, best of 3: 1.29 ms per loop 
+0

ओ_ओ विश्वास नहीं कर सकता कि यह कितना आसान था, मैं 'ज़िप' के बारे में कैसे भूल सकता था? धन्यवाद। कौन सा अधिक कुशल है? 'मानचित्र' या 'सूची-समझ' विधि? –

+0

@ इंबर परीक्षण और पता लगाएं। अंतर्निहित कार्यों के साथ उपयोग किए जाने पर – Triptych

+1

'मानचित्र' कभी-कभी 'सूची समझ' को बेहतर बनाता है। –

2

मैं दिए गए जवाब के लिए कुछ जोड़ना चाहते हैं:

अगर मैं dict जैसे की एक सरणी है

l = [{'quantity': 10, 'price': 5},{'quantity': 6, 'price': 15},{'quantity': 2, 'price': 3},{'quantity': 100, 'price': 2}] 

और मैं मूल्यों पर गणना की गई मात्रा की दो (या अधिक) राशि प्राप्त करना चाहता हूं उदा। मात्रा और मूल्य * मात्रा का योग

मैं कर सकते हैं:

(total_quantity, total_price) = (
sum(x) for x in zip(*((item['quantity'], 
         item['price'] * item['quantity']) 
         for item in l))) 
बजाय

:

total_quantity = 0 
total_price = 0 
for item in l: 
    total_quantity += item['quantity'] 
    total_price += item['price'] * item['quantity'] 

हो सकता है कि पहले समाधान कम पढ़ी जा सकती है, लेकिन अधिक "pythonesque" है :)

+1

अश्विनी के जवाब में क्या जोड़ा जाता है? सवाल –

+1

की एक सूची के बारे में नहीं है, आप सही हैं, लेकिन यह जटिल संचालन के लिए योग और ज़िप का उपयोग करने के बारे में कुछ जोड़ता है। मैं ऐसा कुछ ढूंढ रहा था, मुझे यह जवाब मिल गया है और मैंने इसे अपनी समस्या के लिए इस्तेमाल किया, जो कि डिक्ट्स के बारे में था। इस प्रकार मैंने सोचा कि मेरे समाधान को किसी और के साथ साझा करना अच्छा होगा जो मेरा एक ही मुद्दा हो सकता है। –