2010-11-20 14 views
6

मेरे पास अलग-अलग और सामान्य कुंजी के साथ कई शब्दकोश हैं, साथ ही नेस्टेड शब्दकोश में अलग-अलग और सामान्य कुंजी हैं। नीचे एक सरलीकृत उदाहरण है, वास्तविक शब्दकोशों में हजारों कुंजी हैं।नेस्टेड कुंजीपटल द्वारा घोंसला वाले शब्दकोशों को मर्ज करें?

{1:{"Title":"Chrome","Author":"Google","URL":"http://"}} 
{1:{"Title":"Chrome","Author":"Google","Version":"7.0.577.0"}} 
{2:{"Title":"Python","Version":"2.5"}} 

जो मैं एक एकल शब्दकोश में विलय करना चाहता हूं।

{1:{"Title":"Chrome","Author":"Google","URL":"http://","Version":"7.0.577.0"}, 
2:{"Title":"Python","Version":"2.5"}} 

मैं, दोनों शब्दकोशों से अधिक पुनरावृति कर सकते हैं कुंजी तुलना और update नेस्टेड शब्दकोशों, लेकिन वहाँ शायद एक अधिक कुशल, या pythonic है, जिस तरह से यह करने के लिए। यदि नहीं, तो सबसे कुशल कौन सा है?

नेस्टेड शब्दकोश के मूल्यों की तुलना नहीं की जानी चाहिए।

+0

तुम सच में अनुक्रमिक पूर्णांक कुंजी मानचित्रण कर रहे हैं, इसे और अधिक मतलब नहीं होगा निर्माण करने के लिए आउटपुट के रूप में एक सूची? –

+0

यहां बहुत सारी चर्चाएं और युक्तियां भी हैं: http://stackoverflow.com/questions/38987/how-can-i-merge-two-python-dples-as-a-single-expression – mjhm

+0

बहुत अवास्तविक लगता है कि प्रत्येक "कई शब्दकोशों" में बिल्कुल एक कुंजी/मूल्य जोड़ी है - यह एक आश्चर्य की बात है कि वे शब्दकोश क्यों हैं जब एक साधारण टुपल या इसमें दो वस्तुओं के साथ सूची भी काम करेगी। – martineau

उत्तर

5
from collections import defaultdict 

mydicts = [ 
    {1:{"Title":"Chrome","Author":"Google","URL":"http://"}}, 
    {1:{"Title":"Chrome","Author":"Google","Version":"7.0.577.0"}}, 
    {2:{"Title":"Python","Version":"2.5"}}, 
] 

result = defaultdict(dict) 

for d in mydicts: 
    for k, v in d.iteritems(): 
     result[k].update(v) 

print result 

defaultdict(<type 'dict'>, 
    {1: {'Version': '7.0.577.0', 'Title': 'Chrome', 
     'URL': 'http://', 'Author': 'Google'}, 
    2: {'Version': '2.5', 'Title': 'Python'}}) 
+0

माइनर ट्वीक: दूसरे 'के लिए' को 'k, v = next (d.iteritems())' के साथ प्रतिस्थापित किया जा सकता है और अगली पंक्ति समर्पित है। वास्तव में बहुत अंतर नहीं है, लेकिन यह * तेजी से * देखेंगे। ;-) – martineau

+0

@ मार्टिनौ: यह भी कम उपयोगी लगेगा: 'अगला()' केवल पायथन 2.6+ पर काम करता है। साथ ही जिस तरह से मैंने लिखा था, प्रत्येक 'dict' पर एक से अधिक कुंजी स्वीकार करता है, या गलत चीज करने के बिना खाली' dict' को स्वीकार करता है – nosklo

+0

ठीक है, आप v2.6 से पहले उपलब्ध नहीं होने वाले 'अगले() 'के बारे में सही हैं - - इसे लिखते समय मैं भूल गया कि ओपी एक v2.5 संगत समाधान चाहता था। हालांकि यह तर्कसंगत है कि क्या एक से अधिक कुंजी के साथ खराब गठित नेस्टेड 'dict' को स्वीकार करना वांछनीय होगा, और आखिरकार, 'अगला()' बिना किसी समस्या के खाली 'dict 'को संभाल सकता है। सभी चीजों को माना जाता है, मुझे अभी भी विश्वास है कि मेरी टिप्पणी पाइथन के कम से कम v2.6 का उपयोग करके उन लोगों के लिए एक वैध अवलोकन है। – martineau

2

अपने उदाहरण से, लगता है कि आपने कुछ कर सकते हैं की तरह:

from collections import defaultdict 
mydict = defaultdict(dict) 
for indict in listofdicts: 
    k, v = indict.popitem() 
    mydict[k].update(v) 
संबंधित मुद्दे