2016-07-21 9 views
0

Sagen wir, ich habe eine Liste von dicts. Zum Beispiel kann die Liste enthält die folgenden dicts:Get intersection Elemente von verschachtelten Wörterbüchern in Python

{'david': {'status': 'available', 'type': 'human, 'location': [2, 3, 4]}, 'kuka': {'type': 'robot'}} 

{'david': {'status': 'available', 'location': [2, 3, 4]}, 'kuka': {'status': 'available', 'type': 'robot'}} 

Als Ergebnis (Die Verschachtelungsebene nicht festgelegt ist), möchte ich haben:

{'david': {'status': 'available', 'location': [2, 3, 4]}, 'kuka': {'type': 'robot'}} 

Als Ergebnis Ich möchte dict haben, das gemeinsame Elemente enthält, die in beiden Dicts vorhanden sind, nicht nur die Schlüssel.


Danke für jede Hilfe.

+0

Was haben Sie versucht? –

+0

Um ehrlich zu sein - keine Ahnung bis jetzt ... immer noch etwas herauszufinden ... – eljobso

+0

Ist es möglich, dass der gleiche Schlüssel in beiden Diktaten existiert, aber mit einem anderen Wert? Wenn ja, was würden Sie in diesem Fall tun? –

Antwort

1

Sie können rekursiv über alle Wörterbuchschlüssel iterieren. Die kompakteste Weg, dies zu schreiben, ist wahrscheinlich

def common_items(d1, d2): 
    return {k: common_items(d1[k], d2[k]) if isinstance(d1[k], dict) else d1[k] 
      for k in d1.viewkeys() & d2.viewkeys()} 

Ich würde empfehlen, das Wörterbuch Verständnis heraus zu einer for-Schleife zu buchstabieren den Code besser lesbar zu machen, und ermöglichen einen Fehler im Fall gibt es unterschiedliche Werte zu erhöhen:

def common_items(d1, d2): 
    result = {} 
    for k in d1.viewkeys() & d2.viewkeys(): 
     v1 = d1[k] 
     v2 = d2[k] 
     if isinstance(v1, dict) and isinstance(v2, dict): 
      result[k] = common_items(v1, v2) 
     elif v1 == v2: 
      result[k] = v1 
     else: 
      raise VallueError("values for common keys don't match") 
    return result 
0

Ich verstehe nicht ganz, was Sie mit "Kreuzung" meinen. Wenn Sie die allgemeinen Attribute jedes Wörterbuchelements abrufen möchten, können Sie eine set verwenden, um alle allgemeinen Schlüssel mit den folgenden Codes zu erhalten.

Dann können Sie über das Wörterbuch iterieren, um die gemeinsamen Schlüssel und Werte zu filtern.

+0

Vielleicht war Kreuzung das falsche Wort. Das Ergebnis sollte kein Satz sein, der mir die Information gibt, in welchen Schlüsseln es gemeinsame Schlüssel, Wertepaare gibt, ich möchte, dass die allgemeinen Elemente als Diktat zurückgegeben werden. – eljobso

+0

Eljobso, nach der Anwendung von Neo X, ist es ziemlich einfach, eine Funktion zu schreiben, die den Wert in jedem Wörterbuch für jeden Schlüssel in dem von Ihnen erstellten Satz an eine Liste anhängt. Dann fügen Sie die resultierende Liste von Werten zu einem Wörterbuch mit demselben Schlüssel hinzu. Gib das resultierende Wörterbuch am Ende zurück. – tanikaze