मैं एक एकल डिक्टेट में डिक्सेस की सूची को कैसे मर्ज करूं?


124

मैं इस तरह से dicts की सूची कैसे बदल सकता हूं

[{'a':1}, {'b':2}, {'c':1}, {'d':2}]

इस तरह से एक ही हुक्म चलाना

{'a':1, 'b':2, 'c':1, 'd':2}


यह सच है, हालांकि यह सूची के एक तानाशाह में विलीन हो जाती है।
Katriel

1
यह एक सूची है और एक तानाशाही नहीं है: >>> प्रकार ([{'a': 1}, {'b': 2}]) <प्रकार 'सूची'>
हत्यारे

वास्तव में इस पर विचार करने के लिए एक लाइनर होना चाहिए कि यह कितनी बार आता है। क्या ऐसा कारण है कि {** d के लिए d_list में d} समर्थित नहीं है?
मार्कस

जवाबों:


163

यह किसी भी लम्बाई के शब्दकोशों के लिए काम करता है:

>>> result = {}
>>> for d in L:
...    result.update(d)
... 
>>> result
{'a':1,'c':1,'b':2,'d':2}

एक समझ के रूप में :

# Python >= 2.7
{k: v for d in L for k, v in d.items()}

# Python < 2.7
dict(pair for d in L for pair in d.items())


6
>>> L=[{'a': 1}, {'b': 2}, {'c': 1}, {'d': 2}]    
>>> dict(i.items()[0] for i in L)
{'a': 1, 'c': 1, 'b': 2, 'd': 2}

नोट: 'b' और 'c' का क्रम आपके आउटपुट से मेल नहीं खाता क्योंकि dicts अनियंत्रित हैं

यदि dicts में एक से अधिक कुंजी / मान हो सकते हैं

>>> dict(j for i in L for j in i.items())

यदि सूची में कोई भी एक से अधिक आइटम हैं, तो विफल रहता है।
पॉलएमसीजी

2
खांसी * (प्रत्येक शब्दकोष में एक ही कुंजी-मूल्य जोड़ी होती है) * खांसी
कैट्रील

आह, पहले मैंने एक तरीका पोस्ट किया जो सामान्य डक्ट्स के साथ काम करता है, लेकिन ऐसा लग रहा था कि ओपी को इसकी आवश्यकता नहीं थी
जॉन ला रोय

5

फ्लैट शब्दकोशों के लिए आप ऐसा कर सकते हैं:

from functools import reduce
reduce(lambda a, b: dict(a, **b), list_of_dicts)

4

यह @delnan के समान है लेकिन k / v (कुंजी / मान) आइटम को संशोधित करने का विकल्प प्रदान करता है और मेरा मानना ​​है कि यह अधिक पठनीय है:

new_dict = {k:v for list_item in list_of_dicts for (k,v) in list_item.items()}

उदाहरण के लिए, k / v एलम्स को निम्नानुसार बदलें:

new_dict = {str(k).replace(" ","_"):v for list_item in list_of_dicts for (k,v) in list_item.items()}

डिक्शनरी से वस्तु को निकालने के बाद डिक्शनरी से .items () जेनरेटर से k, v टुपल को अनपैक करें


2
dict1.update( dict2 )

यह असममित है क्योंकि आपको यह चुनने की आवश्यकता है कि डुप्लिकेट कुंजियों के साथ क्या करना है; इस मामले में, dict2अधिलेखित हो जाएगा dict1। उन्हें दूसरे तरीके के लिए एक्सचेंज करें।

संपादित करें: आह, क्षमा करें, यह नहीं देखा।

एकल अभिव्यक्ति में ऐसा करना संभव है:

>>> from itertools import chain
>>> dict( chain( *map( dict.items, theDicts ) ) )
{'a': 1, 'c': 1, 'b': 2, 'd': 2}

इस अंतिम के लिए मुझे कोई श्रेय नहीं!

हालांकि, मेरा तर्क है कि यह एक साधारण forलूप के साथ ऐसा करने के लिए अधिक पाइथोनिक (स्पष्ट> निहित, सपाट> नेस्टेड) ​​हो सकता है । YMMV।


1
इसकी एक सूची और एक तानाशाह नहीं: >>> प्रकार ([{'a': 1}, {'b': 2}]) <प्रकार 'सूची'>
हत्यारे


1

PEP 448 से अनपैकिंग शब्दकोश के साथ @dietbuddha उत्तर के लिए थोड़ा सुधार , मेरे लिए, यह इस तरह से अधिक पठनीय है, साथ ही, यह तेज भी है :

from functools import reduce
result_dict = reduce(lambda a, b: {**a, **b}, list_of_dicts)

लेकिन ध्यान रखें, यह केवल पायथन 3.5+ संस्करणों के साथ काम करता है।


0
>>> dictlist = [{'a':1},{'b':2},{'c':1},{'d':2, 'e':3}]
>>> dict(kv for d in dictlist for kv in d.iteritems())
{'a': 1, 'c': 1, 'b': 2, 'e': 3, 'd': 2}
>>>

नोट मैंने कई प्रविष्टियों के साथ काम करने के लिए अंतिम शब्दकोश में एक दूसरी कुंजी / मूल्य जोड़ी को जोड़ा। इसके अलावा सूची में बाद में dicts से कुंजियाँ पहले से ही उसी कुंजी को अधिलेखित कर देंगी।


-1

dic1 = {'मारिया': 12, 'पैको': 22, 'जोस': 23} dic2 = {'पेट्रीसिया': 25, 'मार्कोस': 22 'टॉमस': 36}

dic2 = dict (dic1.items () + dic2.items ())

और यह परिणाम होगा:

dic2 {'जोस': 23, 'मार्कोस': 22, 'पेट्रीसिया': 25, 'टॉमस': 36, 'पैको': 22, 'मारिया': 12}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.