2012-07-25 18 views
7

की सूची का योग सूची चौराहे को सबसे आसान तरीका है कहते हैं कि मैं tuplesअजगर tuples

myList = [(1, 7), (3, 3), (5, 9)] 
otherList = [(2, 4), (3, 5), (5, 2), (7, 8)] 

returns => [(1, 7), (2, 4), (3, 8), (5, 11), (7, 8)] 

के निम्नलिखित दो सूचियों है मैं किसी मर्ज कार्रवाई पर किसी भी चौराहों को चेक करके इन दोनों सूचियों विलीन हो जाती है डिजाइन करने के लिए चाहते हैं चलो टुपल का पहला तत्व, यदि छेड़छाड़ हो, तो प्रत्येक टुपल के दूसरे तत्वों को प्रश्न में जोड़ें (दोनों को मर्ज करें)। ऑपरेशन के बाद मैं पहले तत्व के आधार पर सॉर्ट करना चाहता हूं।

मैं भी इस क्योंकि मैं अपने एक बहुत ही आम समस्या एक स्पष्ट समाधान है कि लगता है कि पोस्टिंग रहा हूँ, लेकिन मुझे लगता है कि वहाँ इस सवाल का बहुत pythonic समाधान हो सकता है कि;) परिणाम के लिए एक शब्दकोश

उत्तर

14

उपयोग:

result = {} 
for k, v in my_list + other_list: 
    result[k] = result.get(k, 0) + v 

यदि आप टुपल्स की एक सूची चाहते हैं, तो आप इसे result.items() के माध्यम से प्राप्त कर सकते हैं। परिणामस्वरूप सूची मनमानी क्रम में होगी, लेकिन निश्चित रूप से यदि आप वांछित हैं तो इसे सॉर्ट कर सकते हैं।

(। ध्यान दें कि मैं अजगर की शैली सम्मेलनों के अनुरूप अपनी सूची का नाम बदला)

+0

वास्तव में साफ करें। अच्छा समाधान! –

+0

ध्यान दें कि 'result.items() 'पायथन 3 में' dict_items' ऑब्जेक्ट वापस कर देगा। बेशक आप हमेशा' सूची (result.items()) 'कर सकते हैं। – kamek

1

एक विधि का उपयोग कर itertools:

>>> myList = [(1, 7), (3, 3), (5, 9)] 
>>> otherList = [(2, 4), (3, 5), (5, 2), (7, 8)] 

>>> import itertools 
>>> merged = [] 
>>> for k, g in itertools.groupby(sorted(myList + otherList), lambda e: e[0]): 
... merged.append((k, sum(e[1] for e in g))) 
... 
>>> merged 
[(1, 7), (2, 4), (3, 8), (5, 11), (7, 8)] 

यह पहली संयोजित दो सूचियों को एक साथ और यह क्रमबद्ध करता है। itertools.groupby मर्ज किए गए सूची के तत्वों को लौटाता है, जो टुपल के पहले तत्व द्वारा समूहित होते हैं, इसलिए यह उन्हें बस बताता है और इसे मर्ज किए गए सूची में रखता है।

4

उपयोग defaultdict:

from collections import defaultdict 
results_dict = defaultdict(int) 
results_dict.update(my_list) 
for a, b in other_list: 
    results_dict[a] += b 
results = sorted(results_dict.items()) 

नोट: जब दृश्यों, अनुक्रम में पहले आइटम द्वारा sorted प्रकार छँटाई। यदि पहले तत्व समान हैं, तो यह दूसरे तत्व की तुलना करता है। आप sorted से सॉर्ट करने के एक समारोह दे सकते हैं, key कीवर्ड तर्क का उपयोग:

results = sorted(results_dict.items(), key=lambda x: x[1]) #sort by the 2nd item 

या

results = sorted(results_dict.items(), key=lambda x: abs(x[0])) #sort by absolute value 
+0

(+1) मुझे नहीं पता कि इस बार मुझे इस बात का एहसास नहीं हुआ कि 'dict.update' एक अनुक्रम को दंड कन्स्ट्रक्टर के समान ही स्वीकार करता है। इसके अलावा, ओपी द्वारा अनुरोध किए गए टुपल के पहले आइटम को सॉर्ट करना तुच्छ है ('परिणाम = क्रमबद्ध (results_dict.items())' – mgilson

+0

@mgilson: धन्यवाद! मैं एक क्रमबद्ध परिणाम के बारे में हिस्सा याद किया। संपादित करेंगे –

+0

@mgilson: स्पष्ट रूप से 'अद्यतन() 'iterables स्वीकार करने में 2.4 में पेश किया गया था। –

0
>>> [(k, sum(v for x,v in myList + otherList if k == x)) for k in dict(myList + otherList).keys()] 
[(1, 7), (2, 4), (3, 8), (5, 11), (7, 8)] 
>>> 

दोनों Python2.7 के लिए परीक्षण किया और 3.2
dict(myList + otherList).keys() एक युक्त एक iterable रिटर्न शामिल सूचियों के लिए कुंजी का सेट
sum(...) शामिल सूची के माध्यम से फिर से लूप को 'के' लेता है और टुपल आइटम 'v' जोड़ता है जहां के == x

... लेकिन अतिरिक्त लूपिंग प्रसंस्करण ओवरहेड जोड़ता है। स्वेन मार्नैच द्वारा प्रस्तावित एक स्पष्ट शब्दकोश का उपयोग करना इससे बचाता है।

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