2011-03-21 10 views
40

मैं एक अजगर सूची जो कुंजी/मान के जोड़े रखती है:प्रति कुंजी एकाधिक मानों के साथ शब्दकोश रूपांतरण में सूची?

l=[ [1, 'A'], [1, 'B'], [2, 'C'] ] 

मैं एक शब्दकोश है, जहां कुंजी प्रति एक से अधिक मान एक टपल में एकत्रित की जाएगी में सूची परिवर्तित करना चाहते हैं:

{ 1:('A', 'B'), 2:('C',) } 

पुनरावृत्ति समाधान तुच्छ है:

l=[ [1, 'A'], [1, 'B'], [2, 'C'] ] 
d={} 
for pair in l: 
    if d.has_key(pair[0]): 
     d[pair[0]]=d[pair[0]]+tuple(pair[1]) 
    else: 
     d[pair[0]]=tuple(pair[1]) 

print d 

{1: ('A', 'B'), 2: ('C',)} 

वहाँ एक और अधिक सुंदर, इस कार्य के लिए pythonic समाधान है?

+1

एस/multilpe/एकाधिक – vstrien

+0

'has_key' के कूड़ेदान की राह पर है पायथन इतिहास - यदि आपको किसी नियम में किसी कुंजी के अस्तित्व के लिए परीक्षण करना होगा, तो कृपया नए वाक्यविन्यास का उपयोग करें, यदि कुंजी में कुंजी है: '। लेकिन आपके प्रश्न का "ए" जवाब @ यूमिरो का डिफॉल्ट डिक्ट दृष्टिकोण है। – PaulMcG

+2

@vstrien धन्यवाद। '/ G' जोड़ना इसे और अधिक सामान्य बना देगा :-) –

उत्तर

41
from collections import defaultdict 

d1 = defaultdict(list) 

for k, v in l: 
    d1[k].append(v) 

d = dict((k, tuple(v)) for k, v in d1.iteritems()) 

d अब शामिल {1: ('A', 'B'), 2: ('C',)}

d1 मूल्यों के रूप में सूचीबद्ध करता है, जो अंतिम पंक्ति में tuples में परिवर्तित हो जाएगा के साथ एक अस्थायी defaultdict है। इस तरह आप मुख्य लूप में सूचियों को जोड़ रहे हैं और tuples को पुनर्निर्माण नहीं कर रहे हैं।

+1

+1 अतिरिक्त अच्छा, यह मेरे लिए एक नया टूल है। –

7

dict मूल्यों के रूप में tuples के बजाय सूचियों का उपयोग करना:

l=[ [1, 'A'], [1, 'B'], [2, 'C'] ] 
d={} 
for key, val in l: 
    d.setdefault(key, []).append(val) 

print d 
2

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

import itertools 

lst = [(1, 'A'), (1, 'B'), (2, 'C')] 
dct = dict((key, tuple(v for (k, v) in pairs)) 
      for (key, pairs) in itertools.groupby(lst, lambda pair: pair[0])) 
print dct 
# {1: ('A', 'B'), 2: ('C',)} 
+0

यदि आप 'ऑपरेटर आयात' करते हैं, तो आप 'itertools.groupby (सॉर्टेड (एलएसटी), ऑपरेटर.इटेमेट्टर (0)) लिख सकते हैं ' – eumiro

+0

@ यूमिरो। हाँ मुझे पता है। ध्यान दें कि यहां सॉर्ट किए गए वांछित आउटपुट को बदल सकते हैं, इसलिए मैंने पूछा कि क्या वे पहले ही सॉर्ट किए गए हैं (कम से कम कुंजी द्वारा)। – tokland

10

इस विधि अपेक्षाकृत कुशल और काफी कॉम्पैक्ट है:

reduce(lambda x, (k,v): x[k].append(v) or x, l, defaultdict(list)) 
+0

अच्छा लेकिन पाइथन 3.5 या उच्चतम में मान्य नहीं है – Davy

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