2013-02-26 11 views
5

Ich habe eine Liste von Dicts in Python 2.7.Python Liste der Wörterbücher finden Duplikate basierend auf Wert

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

ich die Liste Trog und jene dicts finden gehen möchten, die denselben Wert haben - ich war klar genug id (zB id = 1) und eine neue dict

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

Ich hoffe erstellen

vielen Dank für Ihre Anregungen

+0

Enthalten die Wörterbücher immer zwei Schlüssel, "id" und "desc", oder ist das Problem allgemeiner? – NPE

+0

Ist es wichtig, dass die Reihenfolge in der Liste erhalten bleibt? – entropy

+0

@NPE - das Problem wird "allgemeiner" (und hässlich), wenn OP Strings für einzelne Einträge und Listen für mehrere Einträge behält. – eumiro

Antwort

3

Es ist besser, die „desc“ Werte als Listen zu halten überall, auch wenn sie nur ein einziges Element enthalten. So können Sie tun

Dies würde für Strings auch funktionieren, nur einzelne Zeichen zurückgeben, was nicht das ist, was Sie wollen.

Und nun die Lösung, die Sie eine Liste von dicts von Listen geben:

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 ist jetzt:

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

Was ist, wenn ich auf der Grundlage von mehr als nur einem Schlüssel nach gleichen Werten suchen muss? Ich habe das gleiche Problem, aber die eindeutige ID basiert auf 5 Schlüsseln? – Yebach

+0

Ich weiß, das ist spät, aber Sie können ein Tupel als Diktatschlüssel haben. – jangeador

9

Sie können versuchen:

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()] 

zu Konservierungsauftrag:

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] 
Verwandte Themen