2013-02-26 118 views
5

पर आधारित डुप्लिकेट ढूंढती है मेरे पास अजगर 2.7 में डिक्ट्स की एक सूची है।शब्दकोशों की पायथन सूची मूल्य

a =[{'id': 1,'desc': 'smth'}, 
    {'id': 2,'desc': 'smthelse'}, 
    {'id': 1,'desc': 'smthelse2'}, 
    {'id': 1,'desc': 'smthelse3'},....] 

मैं सूची गर्त जाने के लिए और उन dicts एक ही मूल्य है कि खोजने के लिए चाहते हैं - आईडी (उदाहरण के लिए आईडी = 1) और एक नया dict

b = [{'id':1, 'desc' : [smth, smthelse2,smthelse3]}, 
    {'id': 2, 'desc': 'smthelse'}] 

मुझे आशा है कि मैं काफी स्पष्ट था बनाने

आप अपने सुझाव

+0

क्या शब्दकोश में हमेशा दो कुंजी, 'आईडी' और' desc' होती है, या समस्या अधिक सामान्य होती है? – NPE

+0

क्या यह महत्वपूर्ण है कि सूची में क्रम संरक्षित किया जाए? – entropy

+0

@ एनपीई - यदि समस्या एकाधिक प्रविष्टियों के लिए एकल प्रविष्टियों और सूचियों के लिए स्ट्रिंग रखती है तो समस्या "अधिक सामान्य" (और बदसूरत) होगी। – eumiro

उत्तर

3

के लिए बहुत बहुत धन्यवाद यह सूची के रूप में "desc" मान हर जगह रखने के लिए भले ही वे केवल एक ही तत्व शामिल बेहतर है। इस तरह से आप कर सकते हैं

for d in b: 
    print d['id'] 
    for desc in d['desc']: 
     print desc 

इस तार के लिए भी काम करेगा, बस अलग-अलग पात्रों लौटने है, जो नहीं है तुम क्या चाहते।

और अब समाधान आप सूचियों का dicts की सूची देते हुए:

a =[{'id': 1,'desc': 'smth'},{'id': 2,'desc': 'smthelse'},{'id': 1,'desc': 'smthelse2'},{'id': 1,'desc': 'smthelse3'}] 

c = {} 
for d in a: 
    c.setdefault(d['id'], []).append(d['desc']) 
b = [{'id': k, 'desc': v} for k,v in c.iteritems()] 

b अब है:

[{'desc': ['smth', 'smthelse2', 'smthelse3'], 'id': 1}, 
{'desc': ['smthelse'], 'id': 2}] 
+0

क्या होगा यदि मुझे एक और कुंजी के आधार पर बराबर डिक्ट्स देखना है। मुझे एक ही समस्या है लेकिन अद्वितीय आईडी 5 कुंजी पर आधारित है? – Yebach

+0

मुझे पता है कि यह देर हो चुकी है, लेकिन आप एक ताना कुंजी के रूप में एक tuple हो सकता है। – jangeador

9

आप कोशिश कर सकते हैं:

key = operator.itemgetter('id') 

b = [{'id': x, 'desc': [d['desc'] for d in y]} 
    for x, y in itertools.groupby(sorted(a, key=key), key=key)] 
0
from collections import defaultdict 

d = defaultdict(list) 
for x in a: 
    d[x['id']].append(x['desc']) # group description by id 
b = [dict(id=id, desc=desc if len(desc) > 1 else desc[0]) 
    for id, desc in d.items()] 
करने के लिए

आदेश सुरक्षित रखें:

b = [] 
for id in (x['id'] for x in a): 
    desc = d[id] 
    if desc: 
     b.append(dict(id=id, desc=desc if len(desc) > 1 else desc[0])) 
     del d[id]