Seite 1 von 1
dict for loop - schluessel-wert paar
Verfasst: Sonntag 5. November 2006, 16:55
von Costi
gaaanz einfache sache: ich will in einen for loop immer einen schluessel-wert paar haben
aber wieso geht dies nicht?
Code: Alles auswählen
>>> for i, h in {"server_out": "smtp.mail.yahoo.de", "server_in": "pop.mail.yahoo.de"}:
print i, h
Traceback (most recent call last):
File "<pyshell#8>", line 1, in -toplevel-
for i, h in {"server_out": "smtp.mail.yahoo.de", "server_in": "pop.mail.yahoo.de"}:
ValueError: too many values to unpack
danke
Re: dict for loop - schluessel-wert paar
Verfasst: Sonntag 5. November 2006, 17:25
von Leonidas
Costi hat geschrieben:gaaanz einfache sache: ich will in einen for loop immer einen schluessel-wert paar haben
Stimmt, ist ganz einfach.
Costi hat geschrieben:aber wieso geht dies nicht?
Weil die __iter__() Funktion von dicts per default nur über die Keys iteriert.
Code: Alles auswählen
In [22]: for key, value in {"server_out": "smtp.mail.yahoo.de", "server_in": "pop.mail.yahoo.de"}.iteritems():
....: print key, value
....:
server_in pop.mail.yahoo.de
server_out smtp.mail.yahoo.de
Verfasst: Montag 6. November 2006, 07:44
von Michael Schneider
Hi Costi,
das hängt auch davon ab, was man braucht.
Braucht man einen Iterator, dann iteritems(). Braucht man eine Liste von Tupeln, nimmt man die Methode items():
[(<schluessel>, <wert>)] = {schluessel:wert}.items()
Oder ist die Methode veraltet??
Grüße,
Michael
Verfasst: Montag 6. November 2006, 11:47
von birkenfeld
Zum Iterieren eignet sich besser .iteritems(), weil es keine Liste mit allen Elementen erstellt, sondern nur einen Iterator, der pro Durchlauf ein Schlüssel-Wert-Paar zurückgibt.
Verfasst: Montag 6. November 2006, 13:19
von Y0Gi
AFAIK soll in Zukunft (Py3K?) .iteritems() verschwinden und .items() ebenso wie .keys() und .values() *immer* einen Iterator zurückliefern. Das sollte man berücksichtigen.
Man könnte es so sehen: Lieber jetzt minimal langsameren Code und dafür bei Python 3K diese Methoden nicht anpassen müssen

Verfasst: Montag 6. November 2006, 13:47
von birkenfeld
Py3k ist noch nicht da, und wird noch eine Weile auf sich warten lassen. Warum sind immer alle so darauf versessen, Code zu einer Version kompatibel zu machen, die nicht existiert und nicht einmal spezifiziert ist?
Verfasst: Montag 6. November 2006, 14:07
von Y0Gi
Es geht ja nur darum, dass die .iter*()-Methoden zum Einen schon eine begrenzte Verfügbarkeit bescheinigt bekommen haben, zum Anderen Iteratoren in Zukunft bei vielen oder gar allen derartigen Funktionen und Methoden erwartet werden können (und zwar schon jetzt, unabhängig von Py3K), man also seinen Code im Hinblick darauf entwerfen und implementieren könnte. Dass bis dahin durchaus noch einige Zeit ins Land gehen kann, habe ich ja nicht bestritten. Man sollte es nur im Hinterkopf behalten und ich habe es auch hauptsächlich der Vollständigkeit halber genannt.
Verfasst: Montag 6. November 2006, 14:24
von BlackJack
Ich programmiere lieber in *jetzt* aktuellem Python als mich auf eine Version einzulassen bei der weder die Änderungen, noch das Erscheinungsdatum im Detail feststehen.
Verfasst: Montag 6. November 2006, 17:49
von Leonidas
BlackJack hat geschrieben:Ich programmiere lieber in *jetzt* aktuellem Python als mich auf eine Version einzulassen bei der weder die Änderungen, noch das Erscheinungsdatum im Detail feststehen.
Sehe ich auch so. Und wenn man so bedenkt, dass in Python 3k noch größere Änderungen angedacht sind, dann wird das Umbenennen von .iteritems() zu .items() wohl kaum das größte Problem darstellen. Da kann ich zur Not dann auch Search and Replace laufen lassen.
Verfasst: Montag 6. November 2006, 17:54
von Y0Gi
Ja, ja, schon gut

Verfasst: Montag 6. November 2006, 20:24
von Michael Schneider
birkenfeld hat geschrieben:Zum Iterieren eignet sich besser .iteritems(), weil es keine Liste mit allen Elementen erstellt, sondern nur einen Iterator, der pro Durchlauf ein Schlüssel-Wert-Paar zurückgibt.
Hallo,
ganz mein Reden. Ich wollte auch nur sagen, dass ich mir einige Situationen vorstellen kann, in denen eben eine Liste erwartet wird, und kein Iterator (z.B. wird manchmal der Parametertyp in Fremdmethoden geprüft).
Grüße,
der Michel