replace - Liste als Argument

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
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Hallo!


Folgende Aussgangslage:

Code: Alles auswählen

geschichte = "Das Auto ist rot und das Fahrrrad gelb. Der Apfel ist ebenfalls rot und das Mofa schwarz"

list1 = ['gelb', 'rot', 'schwarz']

list2 = ['grün', 'orange', 'braun']


Nun sollen die Wörter aus list1 durch list2 ersetzt werden, so dass die Variable "geschichte" wie folgt geändert wird:


"Das Auto ist orange und das Fahrrrad grün. Der Apfel ist ebenfalls orange und das Mofa braun"


Gibt es dafür eine passende Funktion?

Ich dachte, "replace" untersützt auch Listen als Arguemnt, jedoch werden nur Strings akzeptiert.


Das geht nicht:


geschichteNeu = geschichte.replace(list1, list2)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst paarweise durch deine Listen laufen, ne dann jeweils die Ersetzung durchführen.
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

__deets__ hat geschrieben: Mittwoch 23. Februar 2022, 09:39 Du musst paarweise durch deine Listen laufen, ne dann jeweils die Ersetzung durchführen.
Wie meinst du das konkret? Kannst du mir ein einfaches Beispiel liefern?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Können natürlich. Aber es geht ja darum, dass du was lernst. Schleifen solltet ihr schon besprochen haben, Zugriff auf Listenelemente bestimmt auch, und damit geht das dann schon.
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich denke, Du sollst den Satz in Wörter aufspalten, dann die Ersetzungswörterliste anwenden und zum Schluß den Satz wieder zusammenbauen.

@__deets__: mit einem nacheinander ausgeführten `replace` kann man `rot` nicht mit `lila` und gleichzeitig `lila` in `grün` umwandeln. Außerdem möchte ich gerne "Brot" essen und kein "Blila".
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@Sirius3: für das gegebene Problem reicht es. Und dein Ansatz löst auch nicht Lila in Grün umzubenennen. Ich persönlich bevorzuge, das notwendige zu machen. YAGNI und so.
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: wir interpretieren die Aufgabe unterschiedlich. Ich lese aus der Aufgabe eindeutig heraus, dass **Wörter** ersetzt werden sollen, und zwar von einer Liste in eine andere Liste. Natürlich könnte man sich auf den Standpunkt stellen, dass der Kunde einem die falschen Testfälle geliefert hat, und damit selber Schuld ist.
Im Extremfall ist dann das die Lösung:

Code: Alles auswählen

def replace_words(sentence, words_to_be_replaced, words_to_replace_with):
    return "Das Auto ist orange und das Fahrrrad grün. Der Apfel ist ebenfalls orange und das Mofa braun"
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da der TE eine Liste vorgegeben hat, ist das eine schon sehr ungewoehnliche Annahnme, dass da einfach ein Satz ersetzt wird.

Ich denke dieses Problem hier in diesem Kontex auch unter der Annahm, was der TE *kann* - replace. Und das zu generalisieren auf x-mal replace ist ein wichtiger gedanklicher Schritt. Die Abstraktion auf Woerter ist ein anderer, und der wird oder sollte auch gegangen werden. Nur nicht notwendigerweise in einem.

Genauso wie dann auch statt zweier Listen natuerlich ein Woerterbuch zum Einsatz kaeme, alleine schon, um Dubletten zu vermeiden bzw. zu erkennen. Womit noch ein Konzept dazu kommt. Wir beide wuerden das sofort so umsetzen. Aber ich bin durchaus ein Freund davon, kleine Inkremente vorzuschlagen bei jemandem, der damit kaempft.
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Die diversen Möglichkeiten wurden bereits benannt: Hier ein wenig Code:

Code: Alles auswählen

geschichte = "Das Auto ist rot und das Fahrrrad gelb. Der Apfel ist ebenfalls rot und das Mofa schwarz"
list1 = ['gelb', 'rot', 'schwarz']
list2 = ['grün', 'orange', 'braun']

# in einer Schleife über den Index
for index in range(len(list1)):
    geschichte = geschichte.replace(list1[index], list2[index])
    
print(geschichte)

Code: Alles auswählen

geschichte = "Das Auto ist rot und das Fahrrrad gelb. Der Apfel ist ebenfalls rot und das Mofa schwarz"
list1 = ['gelb', 'rot', 'schwarz']
list2 = ['grün', 'orange', 'braun']

# in einer Schleife direkt mit den Elementen
for wort, ersatz in zip(list1, list2):
    geschichte = geschichte.replace(wort, ersatz)

print(geschichte)

Code: Alles auswählen

geschichte = "Das Auto ist rot und das Fahrrrad gelb. Der Apfel ist ebenfalls rot und das Mofa schwarz"

# mit einem Dictionary und einer Schleife
woerterbuch = {'gelb': 'grün', 'rot': 'orange', 'schwarz': 'braun'}

for wort in woerterbuch:
    geschichte = geschichte.replace(wort, woerterbuch[wort])

print(geschichte)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten