dict for loop - schluessel-wert paar

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.
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

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
cp != mv
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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 ;)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ja, ja, schon gut :wink:
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten