for statement und target_list

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Dass das folgende syntaktisch korrekt ist, war mir zwar schon vorher klar, aber ich hatte mir nie darüber Gedanken gemacht und es auch nie verwendet. Als ich dies hier gerade gelesen habe, ist mir aufgefallen, dass man zB. sowas machen kann:

Code: Alles auswählen

>>> names = ['Hans', 'Klaus', 'Marie']
>>> some_dict = {}
>>> i = 0
>>> for some_dict[i] in names:
...     i += 1
...
>>> some_dict
{0: 'Hans', 1: 'Klaus', 2: 'Marie'}
Das geht, weil zwischen for und in eine target_list steht, genau wie bei einer Zuweisung. Da bei Zuweisungen sowohl l-values als auch r-values von links nach rechts ausgewertet werden, kann man es noch weiter treiben:

Code: Alles auswählen

>>> n, some_dict[n] = 3, 'Ute'
>>> some_dict
{0: 'Hans', 1: 'Klaus', 2: 'Marie', 3: 'Ute'}
Folglich geht auch sowas:

Code: Alles auswählen

>>> names = ['Hans', 'Klaus', 'Marie']
>>> some_dict = {}
>>> for i, some_dict[i] in enumerate(names):
...     pass
...
>>> some_dict
{0: 'Hans', 1: 'Klaus', 2: 'Marie'}
Wieder eine neue Methode zur Code Obfuscation...
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Falls das jemand nicht auf Anhieb verstanden haben sollte: `i` bekommt den Startwert `0` zugewiesen. `some_dict` meint im Kontext der `for`-Schleife dann, dass dem Schlüsselwert `0` das nächstmögliche Element aus `names` zugewiesen wird. `some_dict` ist also dasselbe wie z.B. das Anlegen des Namens `name` (was man aus dem gewohnten `for name in names:` her kennt), nur dass es natürlich hier ein Zugriff auf das `dict` ist. Bei der Zuweisung verhält es sich exakt so wie bei einem `some_dict[0] = names[0]`. Der Rest sollte dann selbsterklärend sein.

Näheres dazu auch in der Beschreibung zum `for`-Statement aus der Sprachreferenz.

Und bevor jetzt der eine oder andere Anfänger denkt, dies sei ein praktischer Weg, um ein `dict` mit Indexwerten für eine Liste zu erhalten: Nein. Viel klarer und kürzer ist:

Code: Alles auswählen

dict(enumerate(names))
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

snafu hat geschrieben:Und bevor jetzt der eine oder andere Anfänger denkt, dies sei ein praktischer Weg, um ein `dict` mit Indexwerten für eine Liste zu erhalten: Nein. Viel klarer und kürzer ist:

Code: Alles auswählen

dict(enumerate(names))
Und bevor jetzt ein Anfaenger denkt Dictionaries mit Indizes waeren eine gute Sache: Nein, Listen machen das besser. ;)

@mick: Ich bin mir grad nicht sicher, ob ich dir dafuer danken soll oder dich fuer den Scheiterhaufen vorschlagen soll :twisted: Vorerst danke :)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Die Frage auf Stackoverflow hatte ich auch gelesen und spontan gedacht: "Matthias, das vergisst du ganz schnell wieder.".
Antworten