2013-10-24 19 views
10

Gegeben zwei Listen von Wörterbuch:Python: Zusammenführen von zwei Listen von Worten

>>> lst1 = [{id: 1, x: "one"},{id: 2, x: "two"}] 
>>> lst2 = [{id: 2, x: "two"}, {id: 3, x: "three"}] 
>>> merge_lists_of_dicts(lst1, lst2) #merge two lists of dictionary items by the "id" key 
[{id: 1, x: "one"}, {id: 2, x: "two"}, {id: 3, x: "three"}] 

Jede Art und Weise merge_lists_of_dicts zu implementieren, was zwei Listen von Wörterbuch verschmilzt basierend auf den Tasten Wörterbuch Artikel?

+3

was ist wenn lst2 [0] = {id: 2, x: "fünf"} oder wenn lst2 [0] = {id: 2, y: "y"} – alko

+1

Was ist, wenn die "id" gleich ist, aber der Wert ist nicht?, Warum nicht Tupel verwenden, wenn Ihre Wörterbücher nur 1 Element sind? Ich denke, Sie benutzen Wörterbücher falsch? –

+0

verwenden Sie Python 3? – LostAvatar

Antwort

5

Eine Möglichkeit, es zu definieren:

lst1 + [x for x in lst2 if x not in lst1] 
Out[24]: [{'id': 1, 'x': 'one'}, {'id': 2, 'x': 'two'}, {'id': 3, 'x': 'three'}] 

Beachten Sie, dass diese halten beide{'id': 2, 'x': 'three'} und {'id': 2, 'x': 'two'} wie Sie nicht definieren, was in diesem Fall passieren sollte.

Beachten Sie auch, dass die scheinbar-Äquivalent und ansprechender

set(lst1 + lst2) 

wird nicht funktionieren, da dict s nicht hashable sind.

4
lst1 = [{"id": 1, "x": "one"}, {"id": 2, "x": "two"}] 
lst2 = [{"id": 2, "x": "two"}, {"id": 3, "x": "three"}] 

result = [] 
lst1.extend(lst2) 
for myDict in lst1: 
    if myDict not in result: 
     result.append(myDict) 
print result 

Ausgabe

[{'x': 'one', 'id': 1}, {'x': 'two', 'id': 2}, {'x': 'three', 'id': 3}] 
0

Sie es mit copy und update Wörterbuch Methoden tun:

lst3 = lst1.copy() 
lst3.update(lst2) 

# or even, with the addition: 
lst3 = dict(lst1.items() + lst2.items()) 

Wenn in Ihre Wörterbücher duplizieren es, Werte der zweiten verwendet.

Werfen Sie einen Blick auf How to merge two Python dictionaries in a single expression?

+0

Warum rufen Sie die Kopiermethode für die Liste auf? Bei der Frage ging es nicht um die Verschmelzung von Diktaten, sondern um eine Liste von Diktaten. – apopovych

5

Vielleicht ist die einfachste Option

result = {x['id']:x for x in lst1 + lst2}.values() 

Dieses nur einzigartige ids in der Liste hält, nicht jedoch den Auftrag zu erhalten.

Wenn die Listen wirklich groß sind, wäre es eine realistischere Lösung, sie nach id zu sortieren und iterativ zusammenzuführen.