ValueError: string keys in translate table must be of length 1

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
Benutzeravatar
michi-monster
User
Beiträge: 48
Registriert: Donnerstag 7. Dezember 2017, 18:30
Kontaktdaten:

Ich habe auf einer Internetseite folgende Möglichkeit zum Suchen/Ersetzen gefunden:

Code: Alles auswählen

translation_table = {
    "$": "€",
    "?": "!",
    "'": '"',
    "[": None,
    "]": None
}

teststring = """Das ist ein Test? Der kostet ['1000$']"""
print(teststring.translate(str.maketrans(translation_table)))
Ich lasse alles genauso ausser den Zeichen in der Tabelle:

Code: Alles auswählen

translation_table = {
    "s": "M",
    "sc": "fM",
    "'": '"',
    "[": None,
    "]": None
}

teststring = """s soll in M geändert werden. Und sc in fM"""
print(teststring.translate(str.maketrans(translation_table)))
Wieso kommt der Fehler ? :

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/fridolin/PycharmProjects/suchen-ersetzen/translation-tabelle-1.py", line 10, in <module>
    print(teststring.translate(str.maketrans(translation_table)))
ValueError: string keys in translate table must be of length 1

Process finished with exit code 1
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das haben wir vor über einem Monat mit dir doch schon durchdekliniert. Lies mal deinen alten Thread durch. Da hast du schon mal mit translate angefangen.

Und die Fehlermeldung ist auch SEHR eindeutig. Hast du mal versucht die nachzuvollziehen?
Benutzeravatar
michi-monster
User
Beiträge: 48
Registriert: Donnerstag 7. Dezember 2017, 18:30
Kontaktdaten:

Ich verstehe den Fehler nicht. Ich hatte das erst so interprtiert, dass nur ein Zeichen erlaubt ist. Also habe ich in der Übersetzungsliste Alles auf einen Buchstaben geändert.

Code: Alles auswählen

translation_table = {
    "s": "M",
    "c": "f",
    "'": '"',
    "[": None,
    "]": None
}

teststring = """s soll in M geändert werden. Und sc in fM"""
print(teststring.translate(str.maketrans(translation_table)))
Das bringt aber nicht die Lösung. Bitte erläutert mir, was die Kiste will.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das funktioniert doch. Zumindest wirft es keinen Fehler. Wo ist nun das Problem?
Benutzeravatar
michi-monster
User
Beiträge: 48
Registriert: Donnerstag 7. Dezember 2017, 18:30
Kontaktdaten:

Bei mir funzt es nicht. Werden bei einem Test bei Dir die Ersetzungen durchgeführt?

Code: Alles auswählen

fridolin@localhost ~/PycharmProjects/suchen-ersetzen $ less translation-tabelle-1.py 
translation_table = {
    "s": "M",
    "c": "f",
    "'": '"',
    "[": None,
    "]": None
}

fridolin@localhost ~/PycharmProjects/suchen-ersetzen $ python3 translation-tabelle-1.py 
Traceback (most recent call last):
  File "translation-tabelle-1.py", line 10, in <module>
    print(teststring.translate(str.maketrans(translation_table)))
ValueError: string keys in translate table must be of length 1

EDIT: ich habe eine Anpassung unter Linux vorgenommen. Jetzt bekomme ich schonmal die Übersetzungen von einem Zeichen hin. Mit mehreren Zeichen werd ich noch recherchieren müssen ...
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nochmal: wir haben das mit dir schon alles besprochen. Nur weil jetzt 2018 ist, hat sich das nicht geändert. replace ist dein Freund, und wenn du das mehrfach brauchst, dann musst du es mehrfach aufrufen.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

michi-monster hat geschrieben:Jetzt bekomme ich schonmal die Übersetzungen von einem Zeichen hin. Mit mehreren Zeichen werd ich noch recherchieren müssen ...
Es geht nicht mit mehreren Zeichen. Das wäre zwar praktisch, ist aber für translate() leider nicht so vorgesehen. Da hilft auch kein weiteres Recherchieren, sofern du nicht von translate() abrücken willst.
Benutzeravatar
michi-monster
User
Beiträge: 48
Registriert: Donnerstag 7. Dezember 2017, 18:30
Kontaktdaten:

ok - vielen Dank. Ich habe jetzt ein wenig gesucht und geforscht in Sachen replace. Die Ausführung selbst ist erfolgreich. Leider habe ich noch keine Möglichkeit gefunden mehrere Ersetzungen in einer Klammer durchzuführen. Ist es überhaupt möglich? Sonst muss ich vielleicht ausführlicher nach Schleifen suchen. Da gibt es allerdings auch verschiedene Varianten. Wenn ihr mir nen Stichpunkt zu einer geeigneten gebt, würd ich mich freuen. Natürlich noch mehr, wenn ich das in str.replace einfügen kann :-)

Code: Alles auswählen


str = "Round 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3rd chain. (16 sts)"
print(str.replace("3rd", "3."))
print(str.replace("stitch","Masche"))
print(str.replace("into each","in jede/n"))
print(str.replace("Round","Runde"))
print(str.replace("slst","LM"))
print(str.replace("Dc 2 into each stitch","Jede Masche verdoppeln"))
print(str.replace("sts","M"))
print(str.replace("chain","LM"))

/home/fridolin/PycharmProjects/suchen-ersetzen/venv/bin/python /home/fridolin/PycharmProjects/suchen-ersetzen/replace
Round 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3. chain. (16 sts)
Round 2: Ch 3. Dc 2 into each Masche. Join with a slst to the 3rd chain. (16 sts)
Round 2: Ch 3. Dc 2 in jede/n stitch. Join with a slst to the 3rd chain. (16 sts)
Runde 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3rd chain. (16 sts)
Round 2: Ch 3. Dc 2 into each stitch. Join with a LM to the 3rd chain. (16 sts)
Round 2: Ch 3. Jede Masche verdoppeln. Join with a slst to the 3rd chain. (16 sts)
Round 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3rd chain. (16 M)
Round 2: Ch 3. Dc 2 into each stitch. Join with a slst to the 3rd LM. (16 sts)

Process finished with exit code 0
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Mit replace kannst Du eine Zeichenfolge durch eine andere substituieren. Wenn Du dies mehrfach machen möchtest, musst Du replace mehrfach anwenden. Wie Du richtig erkannt hast, käme dafür eine Schleife infrage. Python kennt zwei Arten von Schleifen: for und while. Und jetzt kommt Deine Frage, anhand der Du was lernen kannst: welche solltest Du wählen und warum? Teste es doch einfach mal mit beiden aus, um herauszufinden, worin sie sich unterscheiden. Wenn Du eine definierte Anzahl von Ersetzungen hast, dann wirst Du erkennen, dass eine von beiden genau für solche Fälle konzipiert ist.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die Ersetzungen sollten sinnvollerweise in einer Schleife vorgenommen werden:

Code: Alles auswählen

def multi_replace(text, translations):
    for original, replacement in translations:
        text = text.replace(original, replacement)
    return text
Dann kannst du die Übersetzungen z.B. in einer Liste von (Original, Ersetzung)-Tupeln übergeben.

EDIT: Sorry @kbr
Antworten