Seite 1 von 1

unterschied dict.items() <-> dict.iteritems()

Verfasst: Freitag 17. Februar 2006, 08:26
von jens
Ich hab mal angefangen im Wiki Seiten aus Wikibooks zu übernehmen. Dabei ist mit aufgefallen, das es im Ergebniss zwischen einer Iteration über ein dict mit .items() und .iteritems() eigentlich kein Unterschied besteht s. [wiki]Tutorial/Dictionary#IterationSchleife[/wiki]

In der Referenz ( http://www.python.org/doc/current/lib/t ... ml#l2h-234 ) steht dazu:
a.items() a copy of a's list of (key, value) pairs
a.iteritems() return an iterator over (key, value) pairs
Was bedeutet das in der Praxis?
Ich würde sagen, das man immer iteritems() nehmen sollte. Es sei denn man möchte die Werte in der Schleife ändern, aber dies soll nicht in das dict "zurück kehren"... oder?

Verfasst: Freitag 17. Februar 2006, 09:42
von modelnine
Das kommt arg drauf an welches von den beiden sinnvoller ist. Natürlich ist .iteritems() speichersparender, allerdings hat auch .items() seinen Platz, besonders wenn Du über ein dict iterieren willst und anhand des values entscheiden willst ob Du ein Element löscht oder nicht.

Aber: ich denk man muss da nicht genauer drauf eingehen wenn Dir der prinzipielle Unterschied klar ist: .items() erstellt eine Liste von Tuples die den Inhalt der Hash-Tabelle ausdrücken, während .iteritems() einen Iterator über den Inhalt der Hash-Tabelle zurückgibt (siehe wie hier das Wort erstellt nicht drin auftaucht, der Iterator geht also über die interne Repräsentation der Hash-Tabelle und erstellt nicht erst eine für Dich als Python-Programmierer,die eben nicht mehr an den eigentlichen Inhalt der Hash-Tabelle gebunden ist).

Das ist allein schon vom Datentyp ein massiver Unterschied, aber wann Du welches zu verwenden hast ist denk ich nicht einfach so zu erklären, das kommt immer auf die Situation an.

Verfasst: Freitag 17. Februar 2006, 12:57
von mitsuhiko
Ich würde sagen es gibt da eine Fausregel. Beim Normalen Iterieren nimmt man iteritems(), wenn man eine Liste braucht nimmt man items().
Ausnahmen gibts es eigentlich nur selten welche, denn löschen kann man wärend der Iteration sowieso keine Items.

Verfasst: Freitag 17. Februar 2006, 13:02
von jens
blackbird hat geschrieben:denn löschen kann man wärend der Iteration sowieso keine Items.
Das ist ja genau der Punkt:

Code: Alles auswählen

d = { 1:"Nummer Eins", "zwei":"1-3", "sechs":6 }

for k,v in d.items():
    print k,v
    if k == "zwei":
        del(d[k])

print "-----------------------------"
print d
print "-----------------------------"

for k,v in d.iteritems():
    print k,v
    if k == "sechs":
        del(d[k])
Ausgaben:
1 Nummer Eins
sechs 6
zwei 1-3
-----------------------------
{1: 'Nummer Eins', 'sechs': 6}
-----------------------------
1 Nummer Eins
sechs 6
Traceback (most recent call last):
File "test.py", line 15, in ?
for k,v in d.iteritems():
RuntimeError: dictionary changed size during iteration
Mit items() kann ich elemente aus dem Dict löschen, weil die Schleife ja mit einer Kopie gemacht wird, bei iteritems() klappt das natürlich nicht.