Seite 1 von 1

Dictionary in comprehension list

Verfasst: Freitag 9. März 2012, 14:26
von api
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

Re: Dictionary in comprehension list

Verfasst: Freitag 9. März 2012, 14:43
von Hyperion
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 ;-)

Re: Dictionary in comprehension list

Verfasst: Freitag 9. März 2012, 14:58
von /me
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)}

Re: Dictionary in comprehension list

Verfasst: Freitag 9. März 2012, 15:07
von Hyperion
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.

Re: Dictionary in comprehension list

Verfasst: Freitag 9. März 2012, 15:33
von api
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

Re: Dictionary in comprehension list

Verfasst: Freitag 9. März 2012, 16:03
von Hyperion
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... ;-)

Re: Dictionary in comprehension list

Verfasst: Samstag 10. März 2012, 02:33
von 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.