2015-06-10 37 views
6

मैं अपेक्षाकृत 2.7 अजगर के लिए नया हूँ की सूची में, और StackOverflow पर बड़े पैमाने पर खोज के बावजूद निम्न को समझ नहीं सकता:एक ही कुंजी के मूल्यों मर्ज, dicts

मैं एक dict की list रों मैं wan't है गठबंधन करने के लिए, जब कुंजी समान होती है, और विशिष्ट मान जोड़ें (उदाहरण में 'price')।

इनपुट:

[{'id1': 'a', 'price': '2', 'color': 'green'}, {'id1': 'b', 'price': '5', 'color': 'red'}, {'id1': 'a', 'price': '2', 'color': 'green'}] 

उम्मीद: संपादित करने से पहले अपने प्रश्न के रूप में

[{'id1': 'a', 'price': '4', 'color': 'green'}, {'id1': 'b', 'price': '5', 'color': 'red'}] 

उत्तर

4

एक ही विचार है।

>>> data = [{'id1': 'a', 'price': '2', 'color': 'green'}, 
...   {'id1': 'b', 'price': '5', 'color': 'red'}, 
...   {'id1': 'a', 'price': '2', 'color': 'green'}] 

एक अस्थायी शब्दकोश का निर्माण करें और फिर सूची समझ और शब्दकोश समझ का उपयोग कर इसे

>>> temp = {} 
>>> for d in data: 
...  if d['id1'] not in temp: 
...   temp[d['id1']] = {} 
...  temp_d = temp[d['id1']] 
...  temp_d['price'] = temp_d.get('price', 0) + int(d['price']) 
...  temp_d.setdefault('colors', set()).add(d['color']) 
... 
>>> temp 
{'a': {'colors': {'green'}, 'price': 4}, 'b': {'colors': {'red'}, 'price': 5}} 

में मानों जमा, शब्दकोशों की सूची को फिर से संगठित।

>>> [{'id1': k, 'price': v['price'], 'colors': v['colors']} for k, v in temp.items()] 
[{'id1': 'a', 'colors': {'green'}, 'price': 4}, {'id1': 'b', 'colors': {'red'}, 'price': 5}] 

>>> data = [{'id1': 'a', 'price': '2'}, {'id1': 'b', 'price': '5'}, 
...   {'id1': 'a', 'price': '2'}] 

एक अस्थायी शब्दकोश, जहां हम अपने आईडी के खिलाफ की कीमतों की राशि accummulate कर सकते हैं बनाएँ,

>>> temp = {} 
>>> for d in data: 
...  temp[d['id1']] = temp.get(d['id1'], 0) + int(d['price']) 
... 
>>> temp 
{'a': 4, 'b': 5} 

यहाँ हम temp से और अगर यह d['id1'] का मूल्य प्राप्त करने की कोशिश नहीं मिला, 0 वापस आ जाएगा। इसके बाद हम वर्तमान शब्दकोश से price जोड़ते हैं और परिणाम को वर्तमान आईडी 1 के विरुद्ध temp में वापस स्टोर करते हैं।

फिर list comprehension और शब्दकोश समझ के साथ, शब्दकोशों की सूची को फिर से संगठित, इस

>>> [{'id1': k, 'price': temp[k]} for k in temp] 
[{'price': 4, 'id1': 'a'}, {'price': 5, 'id1': 'b'}] 
+0

बहुत अच्छा। केवल समस्या यह है कि पहले नियम में वास्तव में एक अन्य मूल्य, रंग होता है, किसी एक मौके पर {'id1': 'a', 'price': '2', 'color': 'red'} मैं इसे कैसे रखूं अंतिम नियम? – DauleDK

+0

@DauleDK क्या सभी शब्दकोशों में दिए गए 'id1' के लिए रंग समान होगा? उदाहरण के लिए, यदि 'id1'' a' है और क्या रंग हमेशा 'हरा' होगा? – thefourtheye

+0

हमेशा नहीं, शायद मूल्यों को जोड़ना संभव है? – DauleDK

0

की तरह इस @thefourtheye के रूप में के रूप में अच्छा नहीं है, लेकिन मेरे लिए काम करने लगता है:

di = [{'id1': 'a', 'price': '2', 'color': 'green'}, {'id1': 'b', 'price': '5', 'color': 'red'}, {'id1': 'a', 'price': '2', 'color': 'green'}] 

# Make a dict to hold new values! 
newvals = {} 

for d in di: 
    for key, value in d.iteritems(): 
     if value.isdigit(): 
      if value in newvals: 
       newvals[value] += int(value) 
      else: 
       newvals[value] = int(value) 
     else: 
      if value not in newvals: 
       newvals[value] = value 

for d in di: 
    for nkey, nvalue in d.iteritems(): 
     d[nkey] = newvals[nvalue] 

# Make a unique list of dicts 
print {v['id1']:v for v in di}.values() 

>>>[{'color': 'green', 'price': 4, 'id1': 'a'}, {'color': 'red', 'price': 5, 'id1': 'b'}] 
संबंधित मुद्दे