Wörterbuchansichten sind im Wesentlichen das, was ihr Name sagt: Ansichten sind einfach wie ein Fenster auf den Schlüsseln und Werten (oder Elementen) eines Wörterbuchs. Hier ist ein Auszug aus der offiziellen Dokumentation zu Python 3:
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> keys # No eggs anymore!
dict_keys(['sausage', 'bacon', 'spam'])
>>> values # No eggs value (2) anymore!
dict_values([1, 1, 500])
(Das Python 2-Äquivalent verwendet dishes.viewkeys()
und dishes.viewvalues()
.)
Dieses Beispiel zeigt den dynamischen Charakter von Ansichten : Die Schlüsselansicht ist keine Kopie der Schlüssel zu einem bestimmten Zeitpunkt, sondern ein einfaches Fenster, in dem die Schlüssel angezeigt werden. Wenn sie geändert werden, ändert sich auch das, was Sie durch das Fenster sehen. Diese Funktion kann unter bestimmten Umständen nützlich sein (z. B. kann man mit einer Ansicht der Schlüssel in mehreren Teilen eines Programms arbeiten, anstatt die aktuelle Liste der Schlüssel jedes Mal neu zu berechnen, wenn sie benötigt werden) - beachten Sie, dass die Wörterbuchschlüssel geändert werden Während der Iteration über die Ansicht ist nicht genau definiert, wie sich der Iterator verhalten soll, was zu Fehlern führen kann .
Ein Vorteil besteht darin, dass beispielsweise beim Betrachten der Schlüssel nur eine kleine und feste Menge an Speicher benötigt wird und eine kleine und feste Menge an Prozessorzeit erforderlich ist , da keine Liste von Schlüsseln erstellt wird (Python 2 hingegen). Oft wird unnötigerweise eine neue Liste erstellt, wie von Rajendran T zitiert, die Speicher und Zeit in einer Menge benötigt, die proportional zur Länge der Liste ist. Um die Fensteranalogie fortzusetzen, wenn Sie eine Landschaft hinter einer Wand sehen möchten, machen Sie einfach eine Öffnung darin (Sie bauen ein Fenster); Das Kopieren der Schlüssel in eine Liste würde dem Malen einer Kopie der Landschaft an Ihre Wand entsprechen. Die Kopie benötigt Zeit, Platz und wird nicht selbst aktualisiert.
Zusammenfassend sind Ansichten einfach… Ansichten (Fenster) in Ihrem Wörterbuch, die den Inhalt des Wörterbuchs auch nach dessen Änderung anzeigen. Sie bieten Funktionen, die sich von denen von Listen unterscheiden: Eine Liste von Schlüsseln enthält eine Kopie der Wörterbuchschlüssel zu einem bestimmten Zeitpunkt, während eine Ansicht dynamisch ist und viel schneller abgerufen werden kann, da keine Daten kopiert werden müssen ( Schlüssel oder Werte), um erstellt zu werden.
Wie Sie bereits erwähnt haben, wird
dict.items()
eine Kopie der Liste der (Schlüssel-, Wert-) Paare des Wörterbuchs zurückgegeben, was verschwenderisch ist unddict.iteritems()
einen Iterator über die (Schlüssel-, Wert-) Paare des Wörterbuchs zurückgibt.Nehmen Sie nun das folgende Beispiel, um den Unterschied zwischen einem Diktatorinterprator und einer Diktatansicht zu sehen
Während eine Ansicht Ihnen einfach zeigt, was im Diktat steht. Es ist egal, ob es sich geändert hat:
Eine Ansicht ist einfach so, wie das Wörterbuch jetzt aussieht. Nach dem Löschen wäre ein Eintrag
.items()
veraltet gewesen und.iteritems()
hätte einen Fehler ausgelöst.quelle
viewitems()
ist also tatsächlich richtig (items()
gibt eine Ansicht in Python 3 korrekt wieder ).Schon beim Lesen der Dokumente habe ich den Eindruck:
Ich denke, der Schlüsselverwendungsfall ist, wenn Sie ein Wörterbuch behalten und wiederholt über seine Schlüssel / Elemente / Werte iterieren, wobei dazwischen Änderungen vorgenommen werden. Sie könnten nur einen Blick stattdessen verwenden, Drehen
for k, v in mydict.iteritems():
infor k, v in myview:
. Aber wenn Sie das Wörterbuch nur einmal durchlaufen, sind die Iterationsversionen meiner Meinung nach immer noch vorzuziehen.quelle
iteritems()
. B. ). Was ist der Sinn dieser Ansichten? Wann bin ich froh, sie zu haben?.values()
, aber das beinhaltet das Erstellen einer ganzen Kopie als Liste, was teuer sein könnte. Es gibt,.itervalues()
aber Sie können diese nicht mehr als einmal konsumieren, so dass es nicht mit jeder Funktion funktioniert. Ansichten erfordern keine teure Kopie, sind jedoch als eigenständiger Wert nützlicher als ein Iterator. Aber sie sollen immer noch nicht beim gleichzeitigen Iterieren und Ändern helfen (dort möchten Sie wirklich eine Kopie).Die Ansicht Methoden geben eine Liste (nicht eine Kopie der Liste, im Vergleich zu
.keys()
,.items()
und.values()
), so dass es leichter ist, sondern spiegelt den aktuellen Inhalt des Wörterbuchs.Ab Python 3.0 geben Diktiermethoden Ansichten zurück - warum?
quelle
Mit Ansichten können Sie auf die zugrunde liegende Datenstruktur zugreifen, ohne sie zu kopieren. Neben der Dynamik im Gegensatz zum Erstellen einer Liste ist
in
Test eine der nützlichsten Anwendungen . Angenommen, Sie möchten überprüfen, ob ein Wert im Diktat enthalten ist oder nicht (entweder Schlüssel oder Wert).Option eins besteht darin, eine Liste der Schlüssel mit zu erstellen.
dict.keys()
Dies funktioniert, verbraucht aber offensichtlich mehr Speicher. Wenn das Diktat sehr groß ist? Das wäre verschwenderisch.Mit können
views
Sie die eigentliche Datenstruktur ohne Zwischenliste iterieren.Verwenden wir Beispiele. Ich habe ein Diktat mit 1000 Schlüsseln mit zufälligen Zeichenfolgen und Ziffern und
k
ist der Schlüssel, nach dem ich suchen möchteWie Sie sehen können,
view
steigert das iterierende Objekt die Leistung erheblich und reduziert gleichzeitig den Speicheraufwand. Sie sollten sie verwenden, wenn SieSet
ähnliche Vorgänge ausführen müssen .Hinweis : Ich verwende Python 2.7
quelle
.keys()
nach standardmäßig eine Ansicht zurückgegeben. Vielleicht möchten Sie das noch einmal überprüfenk
einer der Schlüssel des Wörterbuchs istlarge_d
gemeint mit getan werdenk in large_d
, in Python, die wahrscheinlich im Wesentlichen so schnell wie eine Ansicht mit (in anderen Worten,k in large_d.keys()
ist Pythonic nicht und soll avoided- wie es istk in large_d.viewkeys()
).k in large_d
ist eigentlich deutlich schneller alsk in large_d.viewkeys()
, so dass das wohl vermieden werden sollte, aber das macht sinnvoll fürk in large_d.viewvalues()
.