Dictionary in comprehension list

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
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Hallo,

ich habe das folgende kleine Script und würde gerne wissen, warum das syntaktisch falsch ist?

Code: Alles auswählen

dict4 = {}
counter = 0
row = [(115, 89, 45), (44, 115, 115), (156, 115, 211)]

[dict4[counter] = entry for entry in row for counter in range(len(row))]

print dict4

Code: Alles auswählen

    [dict4[counter] = entry for entry in row for counter in range(len(row))]
                    ^
SyntaxError: invalid syntax
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Weil Du eine Zuweisung in einer LC versuchst. Das ist eben syntaktisch falsch. Eine Zuweisung ist ein "Assignment" und laut Doku ein "Simple Statement". Und laut Doku umfassen diese genau eine Zeile (+ ggf. durch Komma getrennte weitere Simple Statements).

Erkläre doch mal bitte, was Du da erreichen willst. So richtig erschlißet es sich mir nicht... und das Anti-Pattern ``for _ in range(len(OBJECT))`` erregt bereits ein Schaudern ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:Erkläre doch mal bitte, was Du da erreichen willst.
Ich tippe auf Folgendes:

Code: Alles auswählen

row = [(115, 89, 45), (44, 115, 115), (156, 115, 211)]
dict4 = {}
for counter, element in enumerate(row):
    dict4[counter] = element
Oder als dict comprehension:

Code: Alles auswählen

dict4 = {counter:element for counter, element in enumerate(row)}
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ach so...

dann biete ich:

Code: Alles auswählen

dict(enumerate(row))
Wobei sich mir der Sinn hier nicht wirklich erschließen mag - denn ob ich nun numerisch über einen Key oder einen Index auf etwas zugreife... naja.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Hallo zusammen,

danke für eure Hinweise.

@Hyperion: Ich habe solch eine Zuweisung auch für ein simples Statement gehalten. Aber ok, wenn das als solches nicht gedacht war - muss man halt wissen.
Ansonsten wollte ich die Liste mit den Tupeln (row) in ein Dictionary einlesen, welches dann einen numerischen Schlüssel hat. Es ging mir aber hauptsächlich um die Comprehension List - da verstand ich nicht, warum so ein Füllen eines Dictionaries nicht funktioniert (aber das ist ja jetzt geklärt).
Der Aufbau des Dictionaries hat allerdings keinen tieferen Sinn - wie du schon sagst, ein numerischer Schlüssel als Key... ich hätte bei meiner Frage wohl stärker darauf hinweisen sollen, dass es mir erstmal "nur" um den Syntax-Fehler geht. Sorry, dafür.

Aber die Hinweise sind trotzdem recht nützlich... :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

api hat geschrieben: @Hyperion: Ich habe solch eine Zuweisung auch für ein simples Statement gehalten. Aber ok, wenn das als solches nicht gedacht war - muss man halt wissen.
Die Zuweisung ist ein "Simple Statement"! Aber nur weil das Wort "simple" darin vorkommt, impliziert das ja nicht, dass man das überall hinschreiben darf... ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@api: An der Stelle wo bei Dir ``dict4[counter] = entry`` steht, wird ein Ausdruck erwartet, der einen Wert ergibt. Zuweisungen haben in Python aber keinen Wert als Ergebnis. Aus genau dem gleichen Grund ist so etwas hier syntaktisch falsch:

Code: Alles auswählen

In [1]: a = (b = 42)
------------------------------------------------------------
   File "<ipython console>", line 1
     a = (b = 42)
            ^
SyntaxError: invalid syntax


In [2]: print b = 42
------------------------------------------------------------
   File "<ipython console>", line 1
     print b = 42
             ^
SyntaxError: invalid syntax
Selbst wenn Dein Code funktioniert hätte, wäre das kein Anwendungsfall für eine „list comprehension”, denn die Liste die dann erstellt würde, verwendest Du gar nicht. Das wäre also unnötige Speicherplatzverschwendung erst eine Liste mit ``len(row)`` Elementen zu erstellen, die dann einfach verworfen wird.
Antworten