2012-07-12 20 views
12

यह पायथन में शास्त्रीय प्रश्न हो सकता है, लेकिन मुझे अभी तक जवाब नहीं मिला है।मैं पाइथन में सूचियों के शब्दकोश में शब्दकोशों की सूची कैसे परिवर्तित करूं?

मेरे पास शब्दकोशों की एक सूची है, इन शब्दकोशों में समान कुंजी हैं। यह इस तरह दिखता है:

[{0: myech.MatchingResponse at 0x10d6f7fd0, 
    3: myech.MatchingResponse at 0x10d9886d0, 
    6: myech.MatchingResponse at 0x10d6f7d90, 
    9: myech.MatchingResponse at 0x10d988ad0}, 
    {0: myech.MatchingResponse at 0x10d6f7b10, 
    3: myech.MatchingResponse at 0x10d6f7f90>}] 

मैं के साथ एक नया शब्दकोश प्राप्त करना चाहते हैं [0,3,6,9] चाबियाँ, और मूल्यों के रूप में "myech.MatchingResponse" की सूची के रूप में।

बेशक मैं इसे एक साधारण पाश का उपयोग करके कर सकता हूं लेकिन मैं सोच रहा था कि कोई और अधिक कुशल समाधान है या नहीं।

+0

रिवर्स के लिए (से dict के- सूचियों की सूची के- dicts के लिए) देखें: https://stackoverflow.com/q/1780174/1959808 –

+0

संबंधित: https://stackoverflow.com/q/30522982/1959808 –

उत्तर

18
import collections 

result = collections.defaultdict(list) 

for d in dictionaries: 
    for k, v in d.items(): 
     result[k].append(v) 
+0

यह बहुत धीमा है! – salomonvh

2

मान लें कि आपकी सूची को मेरी सूची नामक चर के लिए असाइन किया गया है।

mydic = {} 
for dic in mylist: 
    for key, value in dic.items(): 
     if key in mydic: 
      mydic[key].append(value) 
     else: 
      mydic[key] = [value] 
+4

इसके बजाय 'dict.setdefault' या' collections.defaultdict' का उपयोग करें! : डी – jamylak

+0

thx, मैं उस पर एक नज़र डालेगा। कभी भी setdefault का उपयोग नहीं किया। – bigblind

+0

यह भी इसके कुंजी के माध्यम से एक शब्दकोश को पुनरावृत्त करने के बाद से काम नहीं करेगा, इसलिए, 'कुंजी के लिए, मूल्य में मूल्य', एक त्रुटि उठाएगा। कुंजी के लिए 'dic.items() में मान बदलें। संपादित करें: मैंने अभी इसे आपके लिए बदल दिया है – jamylak

1

यह रूप में अच्छी तरह dict समझ के साथ ऐसा करना संभव है ... एक लाइन हो सकता है, लेकिन मैं स्पष्टता के लिए दो पंक्तियों के रूप में यह रखा है। :) में

from itertools import chain 

all_keys = set(chain(*[x.keys() for x in dd])) 
print {k : [d[k] for d in dd if k in d] for k in all_keys} 

परिणाम:

{0: ['a', 'x'], 9: ['d'], 3: ['b', 'y'], 6: ['c']} 
+0

यह नहीं है कि पूछताछ –

+0

@OttoAllmendinger आह के बाद है .. मैंने समस्या को गलत समझा है ... कृपया सही समाधान पर एक नज़र डालें :) –

+0

मुझे प्रदर्शन के बारे में निश्चित नहीं है लेकिन अब यह एक वैध उत्तर है –

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