Problem mit Vergleichsoperatoren (Anfänger-Frage)

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
Elemenope
User
Beiträge: 8
Registriert: Donnerstag 25. Januar 2018, 18:09

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.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst nicht mit and eine beliebige Menge an werten an einen Operator randekorieren. Das Muster dafuer ist

Code: Alles auswählen

   a op b and a op c and ...
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.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@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

Code: Alles auswählen

(',' and ' ')
>>> ' '
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.
Elemenope
User
Beiträge: 8
Registriert: Donnerstag 25. Januar 2018, 18:09

@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.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Elemenope: Du willst wissen ob ein String in einer Menge an Strings enthalten ist, daher der `in`-Operator.

Code: Alles auswählen

if text2[i] not in {'.', ',', ' '}:
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.
Zuletzt geändert von Sirius3 am Donnerstag 25. Januar 2018, 19:30, insgesamt 1-mal geändert.
Elemenope
User
Beiträge: 8
Registriert: Donnerstag 25. Januar 2018, 18:09

@Sirius3:

Alles klar, danke!
Ich probiere es zuhause mal aus.
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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.
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.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kebap: geschweifte Klammern sind Mengen (set). Das ist genau das, was man logisch haben möchte. Dass man auch Listen, Tuple oder sonstige Iterierbare Objekte wie Strings verwenden könnte, ja das geht.
Antworten