2012-05-23 18 views
5

क्या ऐसा करने का एक और समझदार तरीका है? मैं कई अन्य सूचियों के सूचकांक पर संक्षेप में एक नई सूची बनाना चाहता हूं। मैं प्रोग्रामिंग के लिए बिल्कुल नया हूं और यह एक बहुत ही कट्टर विधि की तरह लगता है!पायथन में सूचियों पर सारांश - क्या कोई बेहतर तरीका है?

list1 = [1,2,3,4,5] 
list2 = [1,1,1,4,1] 
list3 = [1,22,3,1,5] 
list4 = [1,2,5,4,5] 
... 
list100 = [4,5,6,7,8] 

i = 0 
while i < len(list1): 
    mynewlist[i] = list1[i]+list2[i]+list3[i]+list4[i]+...list100[i] 
    i = i+1 
+10

पहले, 100 'list1' नामित चरों का निर्माण नहीं करतीं ...; सूचियों की एक सूची का उपयोग करें। – geoffspear

उत्तर

17

यह zip के लिए एक बहुत अच्छा उपयोग केस है।

>>> list1 = [1,2,3,4,5] 
>>> list2 = [1,1,1,4,1] 
>>> list3 = [1,22,3,1,5] 
>>> list4 = [1,2,5,4,5] 
>>> [sum(x) for x in zip(list1, list2, list3, list4)] 
[4, 27, 12, 13, 16] 

या आप अलग-अलग सूचियों के बजाय सूचियों की एक सूची के रूप में अपने डेटा है तो:

>>> data = [[1,2,3,4,5], [1,1,1,4,1], [1,22,3,1,5], [1,2,5,4,5]] 
>>> [sum(x) for x in zip(*data)] 
[4, 27, 12, 13, 16] 

इसी तरह, अगर आप सूचियों का एक dict के रूप में अपने डेटा स्टोर, आप के लिए dict.itervalues() या dict.values() उपयोग कर सकते हैं सूची मूल्यों को पुनः प्राप्त और उपयोग करें कि इसी तरह से:

>>> data = {"a":[1,2,3], "b":[3,4,4]} 
>>> [sum(x) for x in zip(*data.itervalues())] 
[4, 6, 7] 

ध्यान दें कि यदि आपकी सूचियां असमान लंबाई के हैं, zip सबसे छोटी सूची की लंबाई तक काम करेगी। उदाहरण के लिए:

>>> data = [[1,2,3,4,5], [1,1], [1,22], [1,2,5]] 
>>> [sum(x) for x in zip(*data)] 
[4, 27] 

आप एक परिणाम है कि सभी डेटा शामिल हैं पाने के लिए चाहते हैं, आप itertools.izip_longest उपयोग कर सकते हैं (एक उपयुक्त fillvalue के साथ)। उदाहरण:

>>> data = [[1,2,3,4,5], [1,1], [1,22], [1,2,5]] 
>>> [sum(x) for x in izip_longest(*data, fillvalue=0)] 
[4, 27, 8, 4, 5] 
+3

+1 बहुत विस्तृत – jamylak

+0

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

+0

@FakeDIY यदि आप 'dict' का उपयोग कर रहे हैं, तो आप [' .itervalues ​​() '] (http://docs.python.org/library/stdtypes.html#dict.itervalues) का उपयोग करके सूचियों की सूची प्राप्त कर सकते हैं। या ['.values ​​()'] (http://docs.python.org/library/stdtypes.html#dict.values), उदाहरण के लिए 'ज़िप में एक्स के लिए [योग (x) (* dct.itervalues ​​())]' –

6

जबकि @ शॉन का जवाब सही है, यह एक मामले मैं कहाँ लगता है map सूची comprehensions की तुलना में अधिक सुंदर हो सकता है:

>>> list1 = [1,2,3,4,5] 
>>> list2 = [1,1,1,4,1] 
>>> list3 = [1,22,3,1,5] 
>>> list4 = [1,2,5,4,5] 
>>> map(sum, zip(list1, list2, list3, list4)) 
[4, 27, 12, 13, 16] 
+1

मैं सहमत हूं। संबंधित पोस्ट: http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map –

0

आप वास्तव में एक अजगर ट्यूटोरियल पढ़ने की जरूरत है।

  1. sum(list1) आप उस सूची की राशि दे देंगे।
  2. आप for के बारे में छोरों सीखने की जरूरत है
  3. आपकी सूचियां खुद को एक सूची
  4. में संग्रहित किया जाना चाहिए जिस तरह से सूचियों का एक संग्रह को घुमाने के लिए है zip उपयोग करने के लिए:

    list1 = [1,2,3,4,5] 
    list2 = [1,1,1,4,1] 
    list3 = [1,22,3,1,5] 
    zip(list1,list2,list3) 
    # matches up element n of each list with element n of the other lists 
    #=> [(1, 1, 1), (2, 1, 22), (3, 1, 3), (4, 4, 1), (5, 1, 5)] 
    # now you want to add up each of those tuples: 
    [sum(t) for t in zip(list1,list2,list3)] 
    #=> [3, 25, 7, 9, 11] 
    

करने के लिए zip के साथ इस तरह की सूचियों की एक सूची काम करें, itertools मॉड्यूल देखें, या *args सिंटैक्स के बारे में जानें।

1

पहली जगह में समस्या यह है: आपको कभी आपके कोड में 100 चर होना चाहिए।

list1 = [1,2,3,4,5] 
list2 = [1,1,1,4,1] 
list3 = [1,22,3,1,5] 
list4 = [1,2,5,4,5] 
... 
list100 = [4,5,6,7,8] 

इसके बजाय, आप की तरह

list_of_lists = [] 
list_of_lists.append([1,2,3,4,5]) 
list_of_lists.append([1,1,1,4,1]) 
list_of_lists.append([1,22,3,1,5]) 
list_of_lists.append([1,2,5,4,5]) 
... 

कुछ है तो फिर आप इस तरह वांछित परिणाम की गणना होगी चाहिए:

[sum(x) for x in zip(*list_of_lists)] 
+1

हालांकि, यदि आपकी सूचियां समान लंबाई नहीं हैं, तो ज़िप उन्हें छोटी सूची की लंबाई में फिसल देगा (अनदेखा करना पूंछ)। इसलिए, चूंकि ज़िप अनिवार्य रूप से इस सेट को मैट्रिक्स में बदल देता है, यदि आपका सेट काफी बड़ा है, तो आप एक numpy मैट्रिक्स का उपयोग कर बेहतर हो सकते हैं। –

+0

हाँ, ऐसा लगता है कि सभी सूचियां एक ही आकार के हैं, लेकिन यह जोर देना महत्वपूर्ण है कि कोड इस धारणा पर निर्भर करता है, धन्यवाद। – bpgergo

+0

समस्या यह है कि मुझे प्रत्येक सूची को अलग-अलग और उपयोगकर्ता के अनुकूल तरीके से एक्सेस करने में भी सक्षम होना चाहिए। मुझे लगता है कि मुझे सूचियों की सूची नहीं, एक शब्दकोश की आवश्यकता है। – FakeDIY

संबंधित मुद्दे