Hallo,
um mein Problem zu verdeutlichen übertrage ich einfach mal was ich in die Kommandozeile angegeben habe und was der Output war (>>>):
string = "hi, welt"
string[2]
>>> ','
string[3]
>>>' '
string[2] != ','
>>> False
string[3] != ' '
>>> False
string[2] != (',' and ' ')
>>> True
string[3] != (',' and ' ')
>>> False
Das macht überhaupt keinen Sinn für mich.
Warum wird das ',' im zweiten Fall von unten nicht erkannt, obwohl das gleiche bei ' ' funktioniert?
Danke im voraus für eventuelle Hilfen.
Problem mit Vergleichsoperatoren (Anfänger-Frage)
Du kannst nicht mit and eine beliebige Menge an werten an einen Operator randekorieren. Das Muster dafuer ist
Der Grund, warum das scheinbar geht bei einem Fall ist einfach: and ist in Python aus historischen Gruenden etwas anders implementiert, als man es ewartet: bei
a and b
wird *nicht* True oder False zurueckggeben. Sondern a, wenn bool(a) == False, oder sonst b - damit ist der Gesamtwarheitswert dann in deinem Fall ' ', weil ein nicht-leerer String bool('oaeu') == True. Damit wird die rechte Seite zurueckgegeben.
Code: Alles auswählen
a op b and a op c and ...
a and b
wird *nicht* True oder False zurueckggeben. Sondern a, wenn bool(a) == False, oder sonst b - damit ist der Gesamtwarheitswert dann in deinem Fall ' ', weil ein nicht-leerer String bool('oaeu') == True. Damit wird die rechte Seite zurueckgegeben.
@Elemenope: »and« ist kein Umgangssprachliches »und«, wobei Anfänger meist ein Umgangssprachliches »oder« verwenden, als in der Art a ist gleich b oder c, sondern ein logischer Operator, dessen Ergebnis man ganz leicht selbst ausprobieren kann
Der Ausdruck »a and b and c« bedeutet, werte die Ausdrücke a,b,c solange aus, bis einer der Ausdrücke den boolschen Wert unwahr hat und gebe das als Ergebnis des Ausdrucks aus, oder, falls kein Ausdruck unwahr ist, den letzten, was bei Dir der Fall ist.
Code: Alles auswählen
(',' and ' ')
>>> ' '
@Deets und @Sirius3:
Danke für die Antworten.
Ich erweitere meine Frage jetzt mal. Ich hab das nämlich nicht einfach so ausprobiert, sondern hatte vor eine Funktion zu schreiben, die einen beliebigen String als Input (Text) bekommt und aus diesem String das erste Wort als Output gibt.
Dazu habe ich folgendes als Inhalt der Funktion probiert:
ltext = list(text)
text_len = len(text2)
text3 = []
for i in range(text_len):
if ltext != (‚.‘ and ‚,‘ and ‚ ‚):
text3 = text3 + list(ltext)
continue
else:
if ltext[i-1] != (‚.‘ and ‚,‘ and ‚ ‚):
break
else:
continue
text=‚‘.join(text2)
return text
—
(Dass die einfachen Anführungszeichen unten sind bitte ignorieren. Ich schreibe gerade mit dem Handy, da wird das automatisch so formatiert)
Nun meine Frage:
Abgesehen davon, dass es wahrscheinlich deutlich effizientere Wege gibt das Problem zu lösen und ich wahrscheinlich keine Listen Version von text hätte erstellen müssen:
Wie bringe ich den vorhandenen Code zum Laufen?
Was ich mit dem „and“ eigentlich vorhatte wird ja glaub ich klar.
Danke für die Antworten.
Ich erweitere meine Frage jetzt mal. Ich hab das nämlich nicht einfach so ausprobiert, sondern hatte vor eine Funktion zu schreiben, die einen beliebigen String als Input (Text) bekommt und aus diesem String das erste Wort als Output gibt.
Dazu habe ich folgendes als Inhalt der Funktion probiert:
ltext = list(text)
text_len = len(text2)
text3 = []
for i in range(text_len):
if ltext != (‚.‘ and ‚,‘ and ‚ ‚):
text3 = text3 + list(ltext)
continue
else:
if ltext[i-1] != (‚.‘ and ‚,‘ and ‚ ‚):
break
else:
continue
text=‚‘.join(text2)
return text
—
(Dass die einfachen Anführungszeichen unten sind bitte ignorieren. Ich schreibe gerade mit dem Handy, da wird das automatisch so formatiert)
Nun meine Frage:
Abgesehen davon, dass es wahrscheinlich deutlich effizientere Wege gibt das Problem zu lösen und ich wahrscheinlich keine Listen Version von text hätte erstellen müssen:
Wie bringe ich den vorhandenen Code zum Laufen?
Was ich mit dem „and“ eigentlich vorhatte wird ja glaub ich klar.
@Elemenope: Du willst wissen ob ein String in einer Menge an Strings enthalten ist, daher der `in`-Operator.
Zum Code: statt über einen Index iteriert man in Python direkt über die Elemente einer Liste. `continue` sollte man nur in Ausnahmen verwenden, weil es den Programmfluß kompliziert macht. Bei Dir sind sie komplett überflüssig. Die zweite if-Abfrage ist seltsam, weil Du ja dadurch nach maximal 2 Buchstaben abbrichst. Um ein Element an eine Liste anzuhängen, gibt es `append`. Du erzeugst ein text3, das Du nie benutzt.
Code: Alles auswählen
if text2[i] not in {'.', ',', ' '}:
Zuletzt geändert von Sirius3 am Donnerstag 25. Januar 2018, 19:30, insgesamt 1-mal geändert.
Die geschweiften Klammern bei Sirius3 sollen vermutlich runde oder eckige Klammern sein.
Zumindest wüsste ich nicht, was ein Wörterbuch dort zu suchen hätte, besser Liste oder Tupel.
Zumindest wüsste ich nicht, was ein Wörterbuch dort zu suchen hätte, besser Liste oder Tupel.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.