2008-11-04 6 views
33

में सूचियों को जोड़ना/जोड़ना मुझे यकीन है कि ऐसा करने का एक और पाइथोनिक तरीका होना चाहिए - लेकिन मैं एक के बारे में नहीं सोच सकता: मैं एक द्वि-आयामी सूची को एक-आयामी सूची में कैसे विलय कर सकता हूं? ज़िप/मानचित्र की तरह क्रमबद्ध करें लेकिन दो से अधिक इटरेटर के साथ।पायथन

उदाहरण - मैं निम्न सूची है:

array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

मैं

result = [12, 15, 18] # [1+4+7, 2+5+8, 3+6+9] 

करना चाहते हैं अब तक मैं क्या लेकर आए हैं है:

def add_list(array): 
    number_items = len(array[0]) 
    result = [0] * number_items 
    for index in range(number_items): 
     for line in array: 
      result[index] += line[index] 
    return result 

लेकिन उस मेरे लिए बहुत सुरुचिपूर्ण/पायथनिक नहीं दिखता है। यह जांचने के अलावा कि 2 डी सरणी में सभी "रेखाएं" एक ही लंबाई के हैं, एक दूसरे को जोड़ा जा सकता है, आदि। ऐसा करने का एक बेहतर तरीका क्या होगा?

उत्तर

63

[ज़िप (* सरणी) में मान के लिए योग (मान)] काफी मानक है।

यह मदद कर सकता है आप इसे समझते हैं:

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

In [2]: array 
Out[2]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

In [3]: *array 
------------------------------------------------------------ 
    File "<ipython console>", line 1 
    *array 
    ^
<type 'exceptions.SyntaxError'>: invalid syntax 

एकल स्टार अपने आप में एक ऑपरेटर नहीं है। यह फ़ंक्शन कॉल में तर्कों में सरणी तत्वों को अनचाहे करता है।

In [4]: zip(*array) 
Out[4]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)] 

जिप() जिप द्वारा वापस सूची के लिए प्रत्येक तत्व संख्या आप चाहते हैं का एक सेट है एक अंतर्निहित समारोह

In [5]: zip(*array)[0] 
Out[5]: (1, 4, 7) 

है।

In [6]: sum(zip(*array)[0]) 
Out[6]: 12 

In [7]: [sum(values) for values in zip(*array)] 
Out[7]: [12, 15, 18] 
8

आप बात इस तरह का का एक बहुत कर रहे हैं, तो आप के बारे में जानने के लिए scipy.

>>> import scipy 
>>> sum(scipy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])) 
array([12, 15, 18]) 

सभी सरणी आकार आप के लिए स्वचालित रूप से जाँच कर रहे हैं चाहते हैं। योग शुद्ध सी में किया जाता है, इसलिए यह बहुत तेज़ है। scipy सरणी भी बहुत मेमोरी कुशल हैं।

दोष यह है कि आप एक काफी जटिल तृतीय-पक्ष मॉड्यूल पर निर्भर हैं। लेकिन यह कई उद्देश्यों के लिए एक बहुत अच्छा व्यापार है।

14

एक वैकल्पिक तरीका:

map(sum, zip(*array)) 
3

fivebells के साथ सहमत हैं, लेकिन आप भी Numpy है, जो एक छोटे (तेज आयात) और सरणी की तरह सामान के अधिक सामान्य कार्यान्वयन है इस्तेमाल कर सकते हैं। (वास्तव में, यह scipy की निर्भरता है)। ये महान उपकरण हैं, जैसा कि कहा गया है, यदि आप इस तरह के जोड़ों से निपटते हैं तो 'उपयोग करना चाहिए'।

2

खेल के लिए देर हो चुकी है, और यह अन्य लोगों में से कुछ के रूप में एक जवाब के रूप में अच्छा नहीं है, लेकिन मैंने सोचा कि यह एक तरह से प्यारा था:

map(lambda *x:sum(x),*array) 

यह बहुत बुरा है कि sum(1,2,3) काम नहीं करता है।अगर ऐसा होता है, तो हम वहां पर मूर्ख lambda को खत्म कर सकते हैं, लेकिन मुझे लगता है कि यह समझना मुश्किल होगा कि तत्वों का कौन सा (यदि कोई है) योग की "शुरुआत" है। आपको इसे एक कीवर्ड में बदलना होगा केवल बहस जो बहुत सारी स्क्रिप्ट तोड़ देगा ... ओह ठीक है। मुझे लगता है कि हम सिर्फ lambda के साथ रहेंगे।

0

[योग (क) ज़िप में एक के लिए (* सरणी)]

मुझे लगता है कि पसंद है। मैं मदों की एक सूची के लिए में वस्तुओं interleaving के लिए संबंधित कुछ की जरूरत है, यहां तक ​​कि लंबाई सूचियों के लिए समान है, लेकिन अधिक संक्षिप्त कुछ के साथ आया था:

sum(zip(*array),()) 
उदाहरण के लिए

, दो सूचियों interleaving:

a = [1,2,3] 
b = ['a','b','c'] 
sum(zip(a,b),()) 
(1, 'a', 2, 'b', 3, 'c') 
+0

एचएम, दिलचस्प है, यह वास्तव में इस प्रश्न का उत्तर नहीं है (और इस प्रकार डाउनवॉट को आकर्षित कर सकता है)। उदाहरण के लिए, आप सवाल पूछ सकते हैं "मैं कई सूचियों को कैसे रोक सकता हूं?" और इसे अपने आप जवाब दें। शायद एक उदाहरण का उपयोग करें जो दो से अधिक सूचियों का उपयोग करता है, अन्यथा कोई सुझाव देगा ","। (ए) में शामिल हों। –

+0

सहमत टिम। यह इस 'क्यू एंड ए' के ​​एप्रोप्रोस है जो एक थ्रेड द्वारा इंगित किया जा रहा है जो इंटरलिविंग सूचियों को सौदा करता है, लेकिन इस प्रश्न के डुप्लिकेट के रूप में चिह्नित किया गया है! उदाहरण के लिए, मैंने सरलता के लिए ',' का उपयोग किया, मेरे कोड को उपयोगकर्ता परिभाषित कक्षाओं की वास्तविक सूचियों को अंतःस्थापित करने की आवश्यकता थी, लेकिन सार में बहाना मुश्किल होगा। – F1Rumors

0

आप कर सकते हैं

print [sum(x) for x in zip(*array)] 

आप इस फैशन में सूची के माध्यम से पुनरावृति करना चाहते हैं, तो आप itertools मॉड्यूल के chain उपयोग कर सकते हैं: बस ऐसा करने

from itertools import chain 

for x in array.chain.from_iterable(zip(*array)): 
    print x 
# prints 1, 4, 7, 2, 5, 8, ... 

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

  • कोई संबंधित समस्या नहीं^_^