Gibt es anwendbare Unterschiede zwischen dict.items()
und dict.iteritems()
?
Aus den Python-Dokumenten :
dict.items()
: Gibt eine Kopie der Wörterbuchliste der (Schlüssel-, Wert-) Paare zurück.
dict.iteritems()
: Gibt einen Iterator über die Paare des Wörterbuchs (Schlüssel, Wert) zurück.
Wenn ich den folgenden Code ausführe, scheint jeder einen Verweis auf dasselbe Objekt zurückzugeben. Gibt es subtile Unterschiede, die mir fehlen?
#!/usr/bin/python
d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
print 'd.iteritems():'
for k,v in d.iteritems():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
Ausgabe:
d.items():
they are the same object
they are the same object
they are the same object
d.iteritems():
they are the same object
they are the same object
they are the same object
python
dictionary
python-2.x
der Wolf
quelle
quelle
items()
Erstellt die Elemente auf einmal und gibt eine Liste zurück.iteritems()
Gibt einen Generator zurück - Ein Generator ist ein Objekt, das jedes Mal, wennnext()
es aufgerufen wird, jeweils ein Element "erstellt" .d[k] is v
würde immer True zurückgegeben, da Python ein Array von Ganzzahlobjekten für alle Ganzzahlen zwischen -5 und 256 speichert : docs.python.org/2/c-api/int.html Wenn Sie ein Int in diesem Bereich erstellen Eigentlich nur einen Verweis auf das vorhandene Objekt>> a = 2; b = 2 >> a is b True
>> a = 1234567890; b = 1234567890 >> a is b False
iteritems()
geändertiter()
? Der obige Dokumentationslink scheint nicht mit dieser Antwort übereinzustimmen.Antworten:
Es ist Teil einer Evolution.
Ursprünglich hat Python
items()
eine echte Liste von Tupeln erstellt und diese zurückgegeben. Das könnte möglicherweise viel zusätzlichen Speicherplatz beanspruchen.Dann wurden Generatoren in die Sprache im Allgemeinen eingeführt, und diese Methode wurde als Iterator-Generator-Methode mit dem Namen neu implementiert
iteritems()
. Das Original bleibt aus Gründen der Abwärtskompatibilität erhalten.Eine der Änderungen von Python 3 besteht darin, dass
items()
jetzt Iteratoren zurückgegeben werden und eine Liste nie vollständig erstellt wird. Dieiteritems()
Methode ist auch weg, daitems()
in Python 3 wieviewitems()
in Python 2.7 funktioniert .quelle
iteritems()
. Tatsächlich wird ein vollständiges Sequenzprotokollobjekt erstellt, das auch Änderungen am Diktat widerspiegelt (und vom Diktat selbst und nicht von einer redundanten Liste unterstützt wird) - es wurde auf 2.7 as zurückportiertviewitems()
.iteritems()
immer vorzuziehen istitems()
?dict.items()
Gibt eine Liste von 2-Tupeln ([(key, value), (key, value), ...]
) zurück, währenddict.iteritems()
ein Generator 2-Tupel liefert. Ersteres benötigt anfangs mehr Platz und Zeit, aber der Zugriff auf jedes Element ist schnell, während das zweite anfangs weniger Platz und Zeit benötigt, aber etwas mehr Zeit für die Generierung jedes Elements.quelle
copy.deepcopy
). Dies bedeutet, dass es sich um eine Kopie der Wörterbuchelemente handelt: Wenn Sie dies tunitems = dct.items()
und danndct
durch Hinzufügen / Löschen von Schlüsseln oder änderndct[k] = other_v
,items
bleibt dies gleich.{1:'one', 2:'two', ... }
über das ich auf einem Webserver iterieren und die Ergebnisse rendern möchte. In welchem Umfang sollte ich mir Gedanken über die Auswahl von.items()
vs.iteritems()
für Python 2.7 machen?In Py2.x.
Die Befehle
dict.items()
,dict.keys()
unddict.values()
geben eine Kopie der Wörterbuchliste von(k, v)
Paar, Schlüssel und Werte. Dies kann viel Speicherplatz beanspruchen, wenn die kopierte Liste sehr groß ist.Die Befehle
dict.iteritems()
,dict.iterkeys()
unddict.itervalues()
geben ein Iterator über das(k, v)
Wörterbuchpaar, Schlüssel und Werte.Die Befehle
dict.viewitems()
,dict.viewkeys()
unddict.viewvalues()
geben die Ansicht Objekte , die das Wörterbuch der Änderungen reflektieren kann. (Wenn Sie alsodel
ein Element oder ein(k,v)
Paar zum Wörterbuch hinzufügen , kann sich das Ansichtsobjekt gleichzeitig automatisch ändern.)Während in Py3.x.
In Py3.x, sind die Dinge sauber, da es nur gibt
dict.items()
,dict.keys()
und zurdict.values()
Verfügung, die die Rückansicht Objekte als nurdict.viewitems()
in Py2.x tat.Aber
Wie @lvc bemerkt hat, ist das Ansichtsobjekt nicht dasselbe wie der Iterator . Wenn Sie also einen Iterator in Py3.x zurückgeben möchten, können Sie Folgendes verwenden
iter(dictview)
:quelle
Sie haben gefragt: "Gibt es anwendbare Unterschiede zwischen dict.items () und dict.iteritems ()?"
Dies kann helfen (für Python 2.x):
Sie können sehen, dass
d.items()
eine Liste von Tupeln der Schlüssel- und Wertepaare undd.iteritems()
ein Wörterbuch-Elementiterator zurückgegeben werden.Als Liste ist d.items () Slice-fähig:
Hätte aber keine
__iter__
Methode:Als Iterator kann d.iteritems () nicht geschnitten werden :
Hat aber
__iter__
:Die Artikel selbst sind also gleich - der Container, der die Artikel liefert, ist unterschiedlich. Eine ist eine Liste, die andere ein Iterator (abhängig von der Python-Version ...)
Die anwendbaren Unterschiede zwischen dict.items () und dict.iteritems () sind also dieselben wie die anwendbaren Unterschiede zwischen einer Liste und einem Iterator.
quelle
dict.items()
Liste der Tupel zurückgeben unddict.iteritems()
Iteratorobjekt des Tupels im Wörterbuch als zurückgeben(key,value)
. Die Tupel sind gleich, aber der Container ist unterschiedlich.dict.items()
kopiert grundsätzlich alle Wörterbücher in die Liste. Versuchen Sie, den folgenden Code zu verwenden, um die Ausführungszeiten vondict.items()
und zu vergleichendict.iteritems()
. Sie werden den Unterschied sehen.Ausgabe in meiner Maschine:
Dies zeigt deutlich, dass dies
dictionary.iteritems()
viel effizienter ist.quelle
Wenn Sie haben
dict = {key1:value1, key2:value2, key3:value3,...}
In Python 2 ,
dict.items()
Kopien jedes Tupel und gibt die Liste von Tupeln im Wörterbuch dh[(key1,value1), (key2,value2), ...]
. Implikationen sind, dass das gesamte Wörterbuch in eine neue Liste mit Tupeln kopiert wirddict.iteritems()
Gibt den Iterator für Wörterbuchelemente zurück. Der Wert des zurückgegebenen Elements ist ebenfalls derselbe, dh(key1,value1), (key2,value2), ...
dies ist keine Liste. Dies ist nur ein Iteratorobjekt für Wörterbuchelemente. Das bedeutet weniger Speicherbedarf (50% weniger).d.items() -> list(d.items())
d.iteritems() -> iter(d.items())
Die Tupel sind die gleichen. Sie haben jeweils Tupel verglichen, damit Sie gleich sind.
In Python 3 ,
dict.items()
iterator kehrt Objekt. dict.iteritems () wird entfernt, sodass kein Problem mehr auftritt.quelle
dict.iteritems
ist in Python3.x verschwunden. Verwenden Sie alsoiter(dict.items())
, um die gleiche Ausgabe- und Speicherzuordnung zu erhaltenquelle
Wenn Sie die Elementpaare eines Wörterbuchs iterieren möchten, das sowohl mit Python 2 als auch mit Python 3 funktioniert, versuchen Sie Folgendes:
Verwenden Sie es so:
quelle
dict.iteritems()
: gibt Ihnen einen Iterator. Sie können den Iterator in anderen Mustern außerhalb der Schleife verwenden.quelle
dict.iteritems () in Python 2 entspricht dict.items () in Python 3.
quelle