2017-02-13 10 views
0

Ich möchte 2 Wörterbücher für die Zwecke der Datenstandardisierung kombinieren ... Das erste Wörterbuch enthält die Remote-Datenheader und was die Header sollten umgewandelt werden, um ...2 Wörterbücher mit einer Beziehung {X: Y}, {Y: Z} zusammenfassen

Dict 1 = { 
"timestamp": "TimeStamp", 
"name": "SiteName", 
"energy": "PowerExport", 
} 

Dict 2 = { 
"TimeStamp": "13-02-2017 12:34:05", 
"PowerExport": 32, 
"SiteName": "Site 104", 
} 

die Absicht, diese zwei Wörterbücher zu fusionieren, so dass es so etwas wie folgt aussieht:

Dict 1 = { 
"timestamp": "13-02-2017 12:34:05", 
"name": "Site 104", 
"energy": 32, 
} 

so die Absicht ist, zu konvertieren {X: Y}, {Y : Z} zu {X: Z}.

+0

Je nach Kontext könnte es Fälle geben, wo Dict 2, nicht alle Daten Mapping von Dict 1 angegeben enthält (aber Dict 1, wird immer alle erforderlichen Header). Außerdem habe ich keine Kontrolle über die Reihenfolge von Dict 2, also könnte es sein, dass TimeStamp auf Position 4 oder gleich auf Position 7 steht. –

+0

Dicts haben sowieso keine Reihenfolge, so dass der zweite Punkt nicht zutrifft. –

+0

Okay, danke, dass du das geklärt hast. Beitrag aktualisiert, um Verwirrung zu vermeiden! –

Antwort

1

Dies kann mit einem einzigen dict Verständnis erfolgen:

new_dict = {k: dict_2.get(v) for k, v in dict_1.iteritems()} 

Dies verwendet get um sicherzustellen, dass es nicht scheitern, wenn der Schlüssel nicht in dict_2 gefunden wird; Der Wert ist None, wenn das passiert. Dicts haben keine Reihenfolge, also ist das kein Grund zur Sorge.

+0

Funktioniert wie ein Charme, vielen Dank für die schnelle Antwort! Es ist wirklich geschätzt. –

0

eine weitere Option, wenn Sie einen Einzeiler möchten, die keine Einfuhren nicht verwendet, ist: {key:Dict2[value] for key,value in Dict1.items() if Dict2.has_key(value)}

+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/15196841) – KeyWeeUsr

+0

@KeyWeeUsr nicht wahr? es macht den '{X: Y}, {Y: Z} in bis {X: Z}' Teil, der angefordert – Nullman

+0

Code nur Antworten sind sowieso nicht wirklich erwünscht + wie unterscheidet es sich von der bereits angenommenen Antwort? – KeyWeeUsr

0

Oder ohne Wörterbuch Verständnis:

dict1 = { 
    "timestamp": "TimeStamp", 
    "name": "SiteName", 
    "energy": "PowerExport" 
} 
dict2 = { 
    "TimeStamp": "13-02-2017 12:34:05", 
    "PowerExport": 32, 
    "SiteName": "Site 104" 
} 

d = {} 
for k in dict1: 
    if dict1[k] in dict2: 
     d[k] = dict2[dict1[k]] 
Verwandte Themen