Ab Python 3.3 ist eine Klasse namens ChainMap in der Standardbibliothek der Sammlung verfügbar, aber ich werde die Hauptfunktionen als Memorandum aufschreiben.
ChainMap wird verwendet, um mehrere Wörterbücher zu einem Wörterbuch zu sammeln.
Um dasselbe mit dict zu tun, führen Sie mehrere Wörterbücher zusammen und fügen Sie die Elemente der ursprünglichen Wörterbücher hinzu, wie in [diesem Artikel] beschrieben (http://qiita.com/kk6/items/6362a5fc9f3f06a5969a). Ich denke, ich werde ein neues Wörterbuch erstellen.
ChainMap hingegen kopiert keine Elemente in das neue Objekt, behält jedoch das ursprüngliche Wörterbuch als Referenz bei, sodass Sie das ChainMap-Objekt nicht aktualisieren müssen, wenn sich das ursprüngliche Wörterbuch ändert.
Betrachten Sie beispielsweise das folgende Beispiel.
python
from collections import ChainMap
d1 = {'A': 1, 'B':2}
d2 = {'C': 3, 'D':4}
cm = ChainMap(d1, d2)
Wenn Sie nun ein Element zu d1
hinzufügen, können Sie sehen, dass Sie dieses Element auch mit cm
erhalten können.
python
>>> d1['E'] = 5
>>> cm['E']
5
Sie können das Originalwörterbuch mit der Eigenschaft maps abrufen.
python
>>> cm.maps
[{'E': 5, 'B': 2, 'A': 1}, {'D': 4, 'C': 3}]
Wenn zwischen den ursprünglichen Wörterbüchern doppelte Schlüssel vorhanden sind, hat das Element im vorherigen Wörterbuch Vorrang.
python
>>> d1['D'] = 6
>>> cm.maps
[{'E': 5, 'B': 2, 'A': 1, 'D': 6}, {'D': 4, 'C': 3}]
>>> cm['D']
6
Das ursprüngliche Wörterbuch ist nicht auf das integrierte Diktierobjekt beschränkt, sondern es kann ein Zuordnungsobjekt angegeben werden. Im folgenden Beispiel wird "UserDict" aus derselben Standardbibliothek wie das Quellwörterbuch verwendet.
python
from collections import UserDict
class MyDict(UserDict):
def __getitem__(self, key):
if key not in self.data:
return 'Not found'
else:
return self.data[key]
md1 = MyDict(d1)
md2 = MyDict(d2)
cm2 = ChainMap(md1, md2)
In diesem Beispiel wird, selbst wenn "md2" den Schlüssel "C" hat, "getitem" von "md1" zuerst aufgerufen, sodass "Nicht gefunden" zurückgegeben wird.
python
>>> cm2['C']
'Not found'
Recommended Posts