"".join() richtig verwenden zum abgleichen mit einer Liste aus strings

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
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Der code ist ziemlich selbsterklärend.

Code: Alles auswählen

word_list = ["test", "jerk", "ban", "Hello"]

def censor(text, word):
  split_text = text.split()
  for words in split_text:
    if words == " ".join(word_list).split():
      return "yes"
    else:
      return "no"


print censor("Hello World, you're an jerk", word_list)
(wenn ihr irgendwelche Kommentare geben wollt dass Python 2 alt ist: lasse es einfach :) )
Ich lerne gerade python und möchte -in Python 2- eine Funktion, die den eingegebenen String Wort für Wort abgleicht und wenn eines der Wörter in der Liste einem Wort im String entspricht das "yes" ausgegeben wird und wenn nicht, dass "no".
Ich weiß, das mein Fehler einzig und allein hier ist:

Code: Alles auswählen

" ".join(word_list).split()
Wie wird (ausschließlich das) richtig geschrieben, damit mir das gewünschte ergebnis ausgegeben wird? Bitte mit Erklärung, da ich Einsteiger bin :)
Vielen Dank
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2.
Was denkst Du bewirkt ein split nach einem join? Hast Du diesen Ausdruck mal im interaktiven Modus ausprobiert?
Ein String kann daher niemals gleich einer Liste sein. Du suchst eigentlich den in-Operator.
Die Funktion benutzt die globale Variable word_list, statt dem übergebenen Parameter `word`.
So wie die Funktion jetzt da steht, wird nur das erste Wort in text verglichen, da die for-Schleife gleich per `return` abgebrochen wird. Wie soll das Ergebnis eigentlich aussehen?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Es ist auch sehr unglücklich, dass die Liste mit Wörtern in der Funktion `word` heißt, während hingegen ein einzelnes Wort den Namen `words` bekommt.

Alles in allem sieht die Funktion nach einem Einsatzfall für any aus.
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Hi Sirius3 ^^ Scheinst hier ja ganz schön aktiv zu sein :D

Die Aufgabenstellung ist eine funktion zu definieren, die einen String (im späteren Verlauf durch raw_input) Wort für Wort "scant" und die einzelnen Wörter mit einer Liste abgleicht und wenn eines der Wörter im String in der Liste vorkommt, soll das Wort durch Sternchen ersetzt werden. Und ich scheitere daran die Wörter abzugleichen.

.split() soll zuerst den Vorgegebenen String auseinandernehmen. Bei

Code: Alles auswählen

 for words in split_text:
      if words == " ".join(word_list).split(): 
hab ich .split() drin, weil er mir sonst sonst ""test jerk ban Hello"" als einen String ausgibt anstatt jeden Eintrag in der Liste als eigenständigen String.

Im Moment möchte ich einfach, dass mir "Yes" ausgegeben wird, wenn eines der Wörter im String einem Wort in der Liste entspricht und "no", wenn dies eben nicht der Fall ist.

[EDIT:]
Ja, aber die gobale Variable "word" entspricht ja der word_list, da dieses Argument ja im print censor("String", word_list) definiert wird.
Tatsächlich steht es in der Aufgabenstellung, dass das die zwei Argumente in der Funktion -text- und -word- sein sollen...
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Als Ursprung hast du einen Satz und eine Liste mit Wörtern die durch ein * ersetzt werden sollen.

Diesen Satz musst du aufteilen mit split(), dann iterierst du mit einer for-Schleife über diesen gesplitteten Satz. Du prüfst für jedes Wort in dem Satz (also für jedes Element in der Liste) ob dieses Wort in der Liste mit den Wörtern die ersetzt werden sollen ist.
Wenn das der Fall ist musst du herausfinden an welcher Stelle das Wort ist, an diese Stelle schreibst du dann ein *
Am Ende gibst du den Satz mit " ".join() wieder zusammengesetzt aus.
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Jankie so weit bin ich noch garnicht :) Ich muss es erstmal hinbekommen, dass jedes einzelne Element in der Liste, die durch .split() erzeugt wurde mit jedem Element in der word_list abgeglichen wird... daran scheitert es...
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Mr. R341: dass Du die globale Variable word_list benutzt ist trotzdem falsch.
`word_list` ist schon eine Liste. Also die Liste erst mit join zu einem String zu machen und per split wieder in eine Liste umzuwandeln bleibt Quatsch.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Code: Alles auswählen

sentence = "Das ist ein Beispieltext in dem Wörter ersetzt werden sollen."

word_list = ["test", "ein", "ban", "Hello"]

def censor(text, word_list):
  split_text = text.split()
  for word in split_text:
    if word in word_list:
      print("yes")


censor(sentence, word_list)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jankie: ich wüsste gar nicht, dass du die selben Hausaufgaben hast. Damit ist Mr.R341 nicht geholfen. Eingerückt weiter immer mit 4 Leerzeichen pro Ebene.
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Jankie vielen Dank ^^ habs auf meinen Code übertragen und .join(list) raus genommen ^^ vielen Dank, endlich funktionierts :D Jetzt setz ch mich mal daran das Wort zu finden und die Anzahl der Buchstaben durch Sternchen zu ersetzten ^^ vielen Dank :)
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Momentan scheint die Lösung auf so etwas hier hinaus zu laufen:

Code: Alles auswählen

#!/usr/bin/env python3


def censor(text, banned_words):
    banned_words = set(banned_words)
    return " ".join(
        "*" * len(word) if word in banned_words else word
        for word in text.split()
    )


def main():
    print(
        censor("Hello World, you're an jerk", ["test", "jerk", "ban", "Hello"])
    )


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

***** World, you're an ****
Aber nicht zu früh freuen, denn das ist leider keine Lösung. Wenn man nämlich den Rechtschreibfehler korrigiert und den Satz "Hello World, you're an jerk" mit einem Satzzeichen beendet, funktioniert das nicht mehr:

Code: Alles auswählen

***** World, you're an jerk.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

BildBild

Das is Quasi die Aufgabe.. und ich hatte Probleme dass die Liste zum abgleichen abgerufen wird..
Den Rest versuche ich selber wieder :)
Antworten