Problem mit der get-Methode eines Wörterbuches

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
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Hallo,

ich habe folgenden String:

Code: Alles auswählen

string = "100m"
Den möchte ich jetzt in die Bestandteile (d.h. jedes Zeichen) zerlegen und in eine neue Liste speichern. Dabei soll allerdings das „m“ durch eine Zahl ersetzt werden, die ich einem Wörterbuch definiert habe:

Code: Alles auswählen

nummern = {"m":10000}
Die anderen Zahlen sollen so bleiben wie sie sollen und als Integer in der Liste gespeichert werden. Ich habe jetzt gelesen, dass man das mit folgendem Einzeiler machen könnte (klick):

Code: Alles auswählen

nummer_liste = [nummern.get(x, int(x)) for x in string]
Wenn ich das ausführe, kommt allerdings folgender Fehler:
ValueError: invalid literal for int() with base 10: 'm'
Jetzt verstehe ich nicht genau, wieso das so ist. Die Logik ist doch bei der get-Methode, dass er zuerst schaut, ob der Buchstabe im Wörterbuch drin ist, und wenn ja, er das dann ersetzt. Wenn nicht, soll er nur den Buchstaben in ein Integer wandeln. Aber bei dem „m“ scheint er gar nicht erst im Wörterbuch nachzuschauen, bzw. es nicht zu finden.

Wenn ich nur

Code: Alles auswählen

nummer_liste = [nummern.get(x) for x in string]
schreibe, dann lautet nachher das Ergebnis der Liste „[None, None, None, None]“. Bei

Code: Alles auswählen

nummer_liste = [nummern.get(x, x) for x in string]
kommt dann ein ['1', '0', '0', 'm'] heraus.

Wenn ich das gleiche wie in der oben verlinkten Webseite eintrage, dann funktioniert es allerdings. Wo ist denn da jetzt mein Unterschied? Kann mir da jemand helfen?
Danke :)
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Der get-Ausdruck wird ausgewertet bevor der Methoden-Aufruf erfolgt. Zu dem Zeitpunkt ist x = 'm' und Du erhältst den beschriebenen Fehler.
BlackJack

@Helstorm: Argumente werden immer alle ausgewertet *bevor* die Methode (oder Funktion) aufgerufen wird.

Edit: Das Ergebnis von Deinem letzten Beispiel stimmt nicht, da müsste wenn Deine Beschreibung stimmt ``['1', '0', '0', 10000]`` bei heraus kommen. Und wenn es Zahlen sein sollen und als Werte im Wörterbuch auch Zahlen stehen, dann musst Du nur den `int()`-Aufruf anders setzen:

Code: Alles auswählen

In [35]: [int(nummern.get(x, x)) for x in string]
Out[35]: [1, 0, 0, 10000]
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

kbr hat geschrieben:Der get-Ausdruck wird ausgewertet bevor der Methoden-Aufruf erfolgt. Zu dem Zeitpunkt ist x = 'm' und Du erhältst den beschriebenen Fehler.
Ahhh, ja, dann ist das klar. Danke!
BlackJack hat geschrieben:Edit: Das Ergebnis von Deinem letzten Beispiel stimmt nicht, da müsste wenn Deine Beschreibung stimmt ``['1', '0', '0', 10000]`` bei heraus kommen.
Ja, ich möchte nachher als Ergebnis in der Liste „['1', '0', '0', 10000]“ haben. Komisch wieso das oben nicht funktioniert hat. Nachdem ich es jetzt noch einmal ausprobiert habe, ging es. Vielleicht hatte ich noch etwas komisches im Speicher, weil ich da in der Kommandozeile ein bisschen herumprobiert habe.
BlackJack hat geschrieben: Und wenn es Zahlen sein sollen und als Werte im Wörterbuch auch Zahlen stehen, dann musst Du nur den `int()`-Aufruf anders setzen:

Code: Alles auswählen

In [35]: [int(nummern.get(x, x)) for x in string]
Out[35]: [1, 0, 0, 10000]
Super, danke. Dann werde ich das mal ändern. Danke für eure Hilfe.
Antworten