2010-11-20 23 views
6

Ich habe mehrere Wörterbücher mit unterschiedlichen und gemeinsamen Schlüsseln sowie verschiedene und gemeinsame Schlüssel im verschachtelten Wörterbuch. Unten ist ein vereinfachtes Beispiel, die tatsächlichen Wörterbücher haben Tausende von Schlüsseln.Verschachtelte Wörterbücher verschachteln, verschachtelte Schlüssel?

{1:{"Title":"Chrome","Author":"Google","URL":"http://"}} 
{1:{"Title":"Chrome","Author":"Google","Version":"7.0.577.0"}} 
{2:{"Title":"Python","Version":"2.5"}} 

Welche ich möchte in einem einzigen Wörterbuch zusammenführen.

{1:{"Title":"Chrome","Author":"Google","URL":"http://","Version":"7.0.577.0"}, 
2:{"Title":"Python","Version":"2.5"}} 

Ich kann über beide Wörterbücher laufen, vergleichen, Tasten und update die verschachtelten Wörterbücher, aber es ist wahrscheinlich eine effizientere, oder pythonic, Art und Weise, dies zu tun. Wenn nicht, welches ist das effizienteste?

Werte des verschachtelten Wörterbuchs müssen nicht verglichen werden.

+0

Wenn Sie wirklich sequentiellen ganzzahlige Schlüssel abbildet, wäre es nicht mehr Sinn machen, zu produzieren eine Liste als Ausgabe? –

+0

Viele Diskussionen und Tipps auch hier: http://stackoverflow.com/questions/38987/how-can-i-merge-two-python-dictionaries-as-a-single-ausdruck – mjhm

+0

Scheint sehr unrealistisch, dass jeder von die "mehrere Wörterbücher" haben genau ein Schlüssel/Wert-Paar darin - man fragt sich, warum sie überhaupt Wörterbücher sind, wenn ein einfaches Tupel oder eine Liste mit zwei Elementen genauso gut funktionieren würde. – martineau

Antwort

5
from collections import defaultdict 

mydicts = [ 
    {1:{"Title":"Chrome","Author":"Google","URL":"http://"}}, 
    {1:{"Title":"Chrome","Author":"Google","Version":"7.0.577.0"}}, 
    {2:{"Title":"Python","Version":"2.5"}}, 
] 

result = defaultdict(dict) 

for d in mydicts: 
    for k, v in d.iteritems(): 
     result[k].update(v) 

print result 

defaultdict(<type 'dict'>, 
    {1: {'Version': '7.0.577.0', 'Title': 'Chrome', 
     'URL': 'http://', 'Author': 'Google'}, 
    2: {'Version': '2.5', 'Title': 'Python'}}) 
+0

Geringfügige Optimierung: Die zweite 'for' könnte durch' k, v = next (d.iteritems()) 'und die nächste Zeile ersetzt werden. Nicht wirklich viel Unterschied, aber es würde * schneller * aussehen. ;-) – martineau

+0

@martineau: es würde auch weniger nützlich aussehen: 'next()' funktioniert nur auf Python 2.6+. Auch die Art und Weise, wie ich schrieb, akzeptiert mehr als eine Taste bei jedem Diktat, oder leeres "Diktat", ohne zu ersticken oder das Falsche zu tun – nosklo

+0

Nun, du hast mehr über 'next()' nicht vor v2.6 verfügbar - - Beim Schreiben habe ich vergessen, dass der OP eine v2.5-kompatible Lösung wollte. Es ist jedoch fraglich, ob das Akzeptieren schlecht geformter verschachtelter Dikes mit mehr als einem Schlüssel wünschenswert wäre, und schließlich "next()' kann leere 'dict's ohne ein Problem handhaben. Alles in allem glaube ich immer noch, dass mein Kommentar eine gültige Beobachtung für diejenigen ist, die zumindest Python v2.6 benutzen. – martineau

2

Von Ihrem Beispiel sieht, wie man so etwas tun können:

from collections import defaultdict 
mydict = defaultdict(dict) 
for indict in listofdicts: 
    k, v = indict.popitem() 
    mydict[k].update(v) 
Verwandte Themen