2009-03-12 9 views
20

मैं tuples (हमेशा जोड़े) इस तरह की एक सूची है:पायथन में टुपल्स की सूची में प्रत्येक टुपल में पहला मान कैसे जोड़ूं?

[(0, 1), (2, 3), (5, 7), (2, 1)] 

मैं, प्रत्येक जोड़ी में पहली आइटम का कुल योग प्राप्त करना चाहते हैं यानी:

0 + 2 + 5 + 2 

मैं कैसे कर सकता है पायथन में यह करो? फिलहाल मैं सूची के माध्यम से पुनरावृत्ति कर रहा हूं:

sum = 0 
for pair in list_of_pairs: 
    sum += pair[0] 

मुझे लगता है कि वहां एक और पाइथोनिक तरीका होना चाहिए।

+0

क्या आप 2.4 से कम पायथन संस्करण तक सीमित हैं? मैं पूछता हूं क्योंकि आपका चयनित उत्तर अनावश्यक रूप से एक अस्थायी सूची बनाता है। पायथन में छोटा एक-लाइनर> = 24 list_of_pairs में p के लिए 'sum (p [0] है)'। – juanchopanza

उत्तर

48

एक संस्करण अजगर 2.3 के साथ संगत

sum([pair[0] for pair in list_of_pairs]) 

या अजगर के हाल के संस्करणों में, this answer या this one देखते हैं।

+2

मैंने स्क्वायर ब्रैकेट को हटा दिया, क्योंकि वे इसे धीमा कर देते हैं क्योंकि पायथन पहले सूची बनाता है। sum() iterators के साथ बस ठीक काम करता है। –

+1

जीएस, आपने कोड को तोड़ दिया उसी तरह डेविड ने SilentGhost के कोड का काम नहीं किया। आपने सूची जनरेटर अभिव्यक्ति (एक इटरेटर नहीं) में सूची समझ को बदल दिया, जो कि पायथन 2.4 तक अस्तित्व में नहीं था। –

+0

मैंने संपादन को वापस रोल किया क्योंकि यदि आप एक विधि का उपयोग करने जा रहे हैं जो पाइथन 2.3 के साथ संगत नहीं है, तो यह SilentGost के उत्तर में भी एक हो सकता है। –

33
sum(i for i, j in list_of_pairs) 

भी ऐसा करेगा।

+0

मैंने पहले ऐसा सोचा था, लेकिन जब मैंने कोशिश की कि सबसे तेज़ पायथन में मैं इसे एक वाक्यविन्यास त्रुटि उठा सकता हूं :-(बाहर निकलता है मैं पाइथन 2.3 पर परीक्षण कर रहा था, हालांकि ... +1 –

+0

+1: इसे पसंद करें - - टुपल्स का एक निश्चित आकार होता है और आप आमतौर पर जानते हैं कि आकार क्या है। –

+1

मुझे यह दृष्टिकोण भी पसंद है। लेकिन डेविड समाधान वास्तविक समस्या के आधार पर एन-टुपल्स के साथ भी काम करता है, जो कि वास्तविक समस्या के आधार पर बेहतर हो सकता है। –

4

यदि आपके पास बहुत बड़ी सूची या जेनरेटर है जो बड़ी संख्या में जोड़े उत्पन्न करता है तो आप जनरेटर आधारित दृष्टिकोण का उपयोग करना चाहेंगे। मज़े के लिए मैं itemgetter() और imap() का भी उपयोग करता हूं। हालांकि, एक साधारण जनरेटर आधारित दृष्टिकोण पर्याप्त हो सकता है।

import operator 
import itertools 
idx0 = operator.itemgetter(0) 
list_of_pairs = [(0, 1), (2, 3), (5, 7), (2, 1)] 
sum(itertools.imap(idx0, list_of_pairs) 

संपादित करें: itertools.imap() पायथन 2.3 में उपलब्ध है। तो आप वहां जनरेटर आधारित दृष्टिकोण का भी उपयोग कर सकते हैं।

+0

अन्य दो समाधानों की तुलना में वास्तव में तेज़ नहीं है। –

+0

मैं प्रश्न में गति के बारे में कुछ भी पढ़ नहीं पढ़ सकता। –

+0

गति हमेशा अच्छी होती है, और कम से कम उत्तरों में इसका उल्लेख किया जाना चाहिए। –

3

अस्पष्ट (लेकिन मज़ा) जवाब:

>>> sum(zip(*list_of_pairs)[0]) 
9 

या केवल इस काम करना चाहिए जब ज़िप के iterables हैं:

>>> sum(zip(*list_of_pairs).__next__()) 
9 
+0

py3k के लिए काम नहीं करता है: ज़िप ऑब्जेक्ट्स सदस्यता रहित – SilentGhost

+0

.next() उस मामले में ठीक काम करना चाहिए –

+0

mmm, 'ज़िप' ऑब्जेक्ट में कोई विशेषता नहीं है 'अगला'। – SilentGhost

12

मेरा सुझाव है:

sum(i for i, _ in list_of_pairs) 

नोट:

चर _ का उपयोग करना (या __gettext की उर्फ ​​साथ टकराव से बचने के लिए) के बजाय j कम से कम दो लाभ हैं:

  1. _ (जो प्लेसहोल्डर के लिए खड़ा है) बेहतर पठनीयता है
  2. pylint नहीं होगा शिकायत करें: "अप्रयुक्त चर 'जे'"
0

नीचे नमूना कोड है, आप सूची सीमा भी निर्दिष्ट कर सकते हैं।

def test_lst_sum(): 
    lst = [1, 3, 5] 
    print sum(lst) # 9 
    print sum(lst[1:]) # 8 

    print sum(lst[5:]) # 0 out of range so return 0 
    print sum(lst[5:-1]) # 0 

    print sum(lst[1: -1]) # 3 

    lst_tp = [('33', 1), ('88', 2), ('22', 3), ('44', 4)] 
    print sum(x[1] for x in lst_tp[1:]) # 9