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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon jens » Freitag 17. Februar 2006, 08:26

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?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Beitragvon modelnine » Freitag 17. Februar 2006, 09:42

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.
--- Heiko.
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Freitag 17. Februar 2006, 12:57

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.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 17. Februar 2006, 13:02

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]