HOWTO · Python
Schnittpunkt des Python-Wörterbuchs
In diesem Artikel werden die verschiedenen Methoden zum Durchführen von Überschneidungen in zwei Wörterbüchern oder mehreren Wörterbüchern in Python beschrieben, um einfach und effizient ein neues zu erstellen.
Auf dieser Seite
Python bietet keine einzelne integrierte Operation zum Schneiden von Dictionaries. Wähle ein Muster danach aus, ob du gemeinsame Schlüssel, identische Schlüssel-Wert-Paare oder ein neues Mapping benötigst, dessen Werte du auswählst oder kombinierst.
Was bedeutet der Schnitt von Dictionaries?
Ein Dictionary ordnet eindeutigen, hashbaren Schlüsseln Werte zu. Werte können beliebige Python-Objekte sein, darunter veränderliche oder nicht hashbare Objekte wie Listen. Mit dem „Schnitt von Dictionaries“ kann gemeint sein, Schlüssel zu behalten, die in jedem Mapping vorkommen, Paare mit übereinstimmendem Schlüssel und Wert zu behalten oder aus gemeinsamen Schlüsseln ein neues Dictionary zu erstellen. Das sind unterschiedliche Ergebnisse. Lege daher zuerst fest, welches du benötigst, und wähle danach den passenden Code.
Dictionaries anhand gemeinsamer Schlüssel schneiden
Mit einer Dictionary Comprehension behältst du jeden Schlüssel aus dem ersten Dictionary, der auch im zweiten vorkommt. Dieses Muster übernimmt den Wert aus dem ersten Dictionary. Das folgende Beispiel zeigt einen in sich geschlossenen Erfolgsfall:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
first = {"name": "Ada", "team": "blue", "level": 3}
second = {"team": "green", "level": 4, "active": True}
shared = {key: first[key] for key in first if key in second}
print(shared)
Das Ergebnis enthält team und level mit den Werten aus first. Die Einfügereihenfolge eines Dictionarys folgt der Iterationsreihenfolge von first, daher behalten die ausgewählten Einträge diese Reihenfolge bei. Um stattdessen Werte aus dem zweiten Dictionary zu verwenden, schreibe second[key] in den Ausdruck. Zum Kombinieren beider Werte kann der Ausdruck ein Tupel, eine Liste oder einen anderen für die Anwendung geeigneten Wert erzeugen.
Dieses Muster verbindet beispielsweise Zeichenfolgenwerte aus beiden Dictionaries:
first = {1: "My", 2: "I", 3: "age"}
second = {1: "name", 2: "live", 4: "year"}
joined = {key: first[key] + " " + second[key] for key in first if key in second}
print(joined)
Weitere Informationen zur Syntax findest du unter Dictionary Comprehension.
Dictionaries anhand übereinstimmender Schlüssel-Wert-Paare schneiden
Verwende dict.items(), wenn ein Paar nur dann ins Ergebnis aufgenommen werden soll, wenn Schlüssel und Wert gemeinsam in beiden Dictionaries vorkommen. Die items()-Ansicht eines Dictionarys unterstützt Mengenoperationen, sofern die Schlüssel und Werte der Paare hashbar sind. Listenwerte können insbesondere nicht Elemente dieser Mengenoperation sein. Der Operator & wird hier auf die beiden items()-Ansichten angewendet; er ist kein Dictionary-Operator.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
first = {"A": 1, "B": 6, "C": 3, "D": 5}
second = {"A": 1, "C": 4, "D": 5, "E": 2}
matching_pairs = dict(first.items() & second.items())
print(matching_pairs)
So bleiben Paare wie ("A", 1) und ("D", 5) erhalten. Das Paar ("C", 3) wird ausgeschlossen, weil das zweite Dictionary "C" einem anderen Wert zuordnet. Wenn nur die Schlüssel wichtig sind, schneide stattdessen die Schlüsselansichten. Diese Operation liefert eine Menge, kein Dictionary:
first = {"A": 1, "B": 6, "C": 3}
second = {"A": 9, "C": 4, "D": 2}
shared_keys = first.keys() & second.keys()
print(shared_keys)
Wenn der nächste Schritt ein Mapping benötigt, verwende eine Comprehension über shared_keys und lege ausdrücklich fest, welches Dictionary die jeweiligen Werte liefert.
Mehrere Dictionaries schneiden
Bei drei oder mehr Dictionaries erhältst du durch den Schnitt ihrer Schlüsselansichten die Schlüssel, die überall vorkommen. Erstelle anschließend ein Ergebnis mit Werten aus einer ausgewählten Quelle. Das unterscheidet sich vom Schnitt übereinstimmender Paare, bei dem auch jeder Wert übereinstimmen muss:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
first = {"A": 1, "B": 6, "C": 3, "D": 5}
second = {"A": 1, "C": 4, "D": 5, "E": 2}
third = {"A": 8, "C": 3, "D": 5, "E": 1}
shared_keys = first.keys() & second.keys() & third.keys()
from_first = {key: first[key] for key in shared_keys}
matching_pairs = dict(first.items() & second.items() & third.items())
print(from_first)
print(matching_pairs)
from_first enthält alle Schlüssel, die in den drei Dictionaries vorkommen, und verwendet dafür die Werte aus first. matching_pairs enthält nur identische Paare, die in allen drei Dictionaries vorkommen. Für mehrere Dictionaries in einer Sequenz lässt sich die Schlüsseloperation mit set.intersection() ausdrücken: Übergebe die Schlüssel jedes Dictionarys als Mengenargument und verwende anschließend eine Comprehension, falls ein Dictionary als Ergebnis benötigt wird. Beide Mengenoperationen und die Form mit & arbeiten mit hashbaren Schlüsseln; für den Schnitt von Schlüssel-Wert-Paaren müssen zusätzlich die Werte hashbar sein.
Die passende Methode für den Schnitt auswählen
- Verwende eine Comprehension mit
key in other, wenn du ein neues Dictionary mit gemeinsamen Schlüsseln erstellen und Werte auswählen oder kombinieren möchtest. - Verwende den Mengenschnitt von
dict.items(), wenn das gesamte Schlüssel-Wert-Paar identisch sein muss. Beachte, dass beide Bestandteile jedes Paars hashbar sein müssen. - Verwende
set.intersection()oder den Schnitt von Schlüsselansichten, wenn du nur die gemeinsamen Schlüssel benötigst. Das Ergebnis ist eine Menge; erstelle bei Bedarf separat ein Dictionary.
Mit diesen Mustern ist die Bedeutung des Ergebnisses klar, und sie funktionieren mit zwei oder mehr Dictionaries. Wähle die Operation anhand der Daten aus, die du erhalten möchtest, und lege anschließend fest, welches Mapping die Werte für das neue Dictionary liefert.