Seite 1 von 1

Problem mit der get-Methode eines Wörterbuches

Verfasst: Montag 1. Juli 2013, 13:03
von Hellstorm
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 :)

Re: Problem mit der get-Methode eines Wörterbuches

Verfasst: Montag 1. Juli 2013, 13:14
von kbr
Der get-Ausdruck wird ausgewertet bevor der Methoden-Aufruf erfolgt. Zu dem Zeitpunkt ist x = 'm' und Du erhältst den beschriebenen Fehler.

Re: Problem mit der get-Methode eines Wörterbuches

Verfasst: Montag 1. Juli 2013, 13:14
von 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]

Re: Problem mit der get-Methode eines Wörterbuches

Verfasst: Montag 1. Juli 2013, 13:46
von Hellstorm
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.