2012-12-09 62 views
19

data = [[3,7,2],[1,4,5],[9,8,7]]सूचियों की सूची का योग; योग सूची

चलो कहते हैं कि मैं एक ही सूची प्राप्त करने के एक मैट्रिक्स स्तंभ में संख्याओं को जैसे चाहें सूची में प्रत्येक सूची के सूचकांकों के लिए तत्वों योग करने के लिए, चाहते हैं चलो देता है। मुझे लगता है कि डेटा में सभी सूचियां लंबाई में बराबर हैं।

print foo(data) 

    [[3,7,2], 
    [1,4,5], 
    [9,8,7]] 
    _______ 
>>>[13,19,14] 

मैं श्रेणी त्रुटि से बाहर सूचकांक प्राप्त किए बिना सूचियों की सूची में कैसे पुन: प्रयास कर सकता हूं? शायद लैम्ब्डा? धन्यवाद!

+0

[आपने क्या प्रयास किया है?] (Http://whathaveyoutried.com/) –

उत्तर

51

आप इस कोशिश कर सकते:

In [9]: l = [[3,7,2],[1,4,5],[9,8,7]] 

In [10]: [sum(i) for i in zip(*l)] 
Out[10]: [13, 19, 14] 

यह zip और * के संयोजन का उपयोग सूची अनपैक करने के लिए और फिर अपने सूचकांक के अनुसार आइटम ज़िप। फिर आप समान सूचकांक के समूहों के माध्यम से पुनरावृत्ति करने और उनकी 'मूल' स्थिति में लौटने के लिए एक सूची समझ का उपयोग करते हैं।

उम्मीद है कि यह थोड़ा और अधिक स्पष्ट करने के लिए यहां क्या होता है जब आप zip(*l) के माध्यम से पुनरावृति है:

In [13]: for i in zip(*l): 
    ....:  print i 
    ....:  
    ....:  
(3, 1, 9) 
(7, 4, 8) 
(2, 5, 7) 

सूचियों कि असमान लंबाई के हैं, के मामले में आप 0 के fillvalue साथ itertools.izip_longest उपयोग कर सकते हैं - इस मूल रूप से 0 साथ लापता सूचकांक भरता है, आप सभी 'कॉलम' योग करने के लिए अनुमति देता है:

In [1]: import itertools 

In [2]: l = [[3,7,2],[1,4],[9,8,7,10]] 

In [3]: [sum(i) for i in itertools.izip_longest(*l, fillvalue=0)] 
Out[3]: [13, 19, 9, 10] 

इस मामले में, यहाँ हैसे अधिक क्या बार-बार दोहरानालगेगा जैसे:

In [4]: for i in itertools.izip_longest(*l, fillvalue=0): 
    ...:  print i 
    ...:  
(3, 1, 9) 
(7, 4, 8) 
(2, 0, 7) 
(0, 0, 10) 
+0

बहुत स्पष्ट स्पष्टीकरण और संक्षिप्त कोड। धन्यवाद!! – Albert

+0

@ अल्बर्ट कोई समस्या नहीं, सब कुछ के साथ शुभकामनाएँ! – RocketDonkey

+2

या 'मानचित्र (योग, ज़िप (* एल)) '(यह मेरा पसंदीदा है)। – arshajii

0

यह आपके धारणा पर निर्भर करता है कि सभी आंतरिक सूची (या पंक्तियाँ) एक ही लंबाई के होते हैं, लेकिन यह आप क्या चाहते हैं करना चाहिए:

sum_list = [] 

ncols = len(data[0]) 

for col in range(ncols): 
    sum_list.append(sum(row[col] for row in data)) 


sum_list 
Out[9]: [13, 19, 14] 
7

किसी भी मैट्रिक्स (या अन्य महत्वाकांक्षी संख्यात्मक) के लिए आपरेशन मैं NumPy में देखने की सिफारिश करेंगे।

अक्ष अपने प्रश्न में दिखाया गया है साथ एक सरणी की राशि को सुलझाने के लिए नमूना होगा: http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html#numpy.sum

विशेष रूप से दूसरा तर्क के रूप में दिलचस्प है:

>>> from numpy import array 
>>> data = array([[3,7,2], 
...  [1,4,5], 
...  [9,8,7]]) 
>>> from numpy import sum 
>>> sum(data, 0) 
array([13, 19, 14]) 

यहाँ अपने योग समारोह के लिए numpy के दस्तावेज़ है यह आसानी से निर्दिष्ट करता है कि क्या सारांशित किया जाना चाहिए: सभी तत्व या केवल संभावित एन-आयामी सरणी (जैसे) का एक विशिष्ट अक्ष।

+0

पूछताछ के लिए धन्यवाद। मैंने एक नमूना जोड़ा। मुझे लगता है कि यह किसी अन्य नमूने की तुलना में अधिक समय और अंतरिक्ष कुशल होगा। – Theuni

+0

बहुत ठंडा (और मेरे से पचाने के लिए आसान वाक्यविन्यास :))। – RocketDonkey

+0

सराहना की - विशेष रूप से दिया गया कि मैंने पहले कभी नम्पी का उपयोग नहीं किया था, लेकिन मुझे कुछ ऐसे लोग जानते हैं जो वैज्ञानिक कंप्यूटिंग करते हैं और इसका व्यापक रूप से उपयोग करते हैं। मैं खुद को हैरान था कि यह कितना आसान था। – Theuni

1
>>> data = [[1, 2, 3], [1, 2, 3], [1, 2, 3]] 
>>> for column in enumerate(data[0]): 
...  count = sum([x[column[0]] for x in data]) 
...  print 'Column %s: %d' % (column[0], count) 
... 
Column 0: 3 
Column 1: 6 
Column 2: 9 
6

यह आपको योग प्रत्येक sublist

data = [[3,7,2],[1,4],[9,8,7,10]] 
list(map(sum, data)) 
[12, 5, 34] 

के लिए आप सभी तत्वों से अधिक योग और फिर इस

data = [[3,7,2],[1,4],[9,8,7,10]] 
sum(sum(data, [])) 
51 
+0

क्या आप Coursera पर रैखिक बीजगणित पाठ्यक्रम नहीं कर रहे हैं? क्या आप समझा सकते हैं कि दूसरा क्यों काम करता है? – Parseltongue

0
का उपयोग सिर्फ एक राशि प्राप्त करना चाहते हैं दे देंगे
def sum(L): 
res = list() 
for j in range(0,len(L[0])): 
    tmp = 0 
    for i in range(0,len(L)): 
     tmp = tmp + L[i][j] 
    res.append(tmp) 
return res 
संबंधित मुद्दे