wie erzeugt man eine XOR Abfrage?

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

In meinem Rechenduell muss etwas passieren, wenn entweder der eine oder der andere Duellant ein Aufsteiger ist, aber nicht beide. Das ist doch eine XOR Abfrage?
Ich habe es nur so hinbekommen:

Code: Alles auswählen

if (duellant_1.aufsteiger or duellant_2.aufsteiger) and not (duellant_1.aufsteiger and duellant_2.aufsteiger):
Benutzeravatar
pillmuncher
User
Beiträge: 1529
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Pitwheazle:
Was soll passieren, wenn keiner der beiden ein Aufsteiger ist?

Hier die Wahrheitstabelle für xor:

Code: Alles auswählen

   d1  |  d2  | xor
  -------------------
   F   |  F   |  F
   T   |  F   |  T
   F   |  T   |  T
   T   |  T   |  F
Wenn es sicher ist, dass du xor verwenden möchtest und dass die d.aufsteiger immer bool sind, kannst du einfach das hier benutzen:

Code: Alles auswählen

if duellant_1.aufsteiger != duellant_2.aufsteiger:
In specifications, Murphy's Law supersedes Ohm's.
nezzcarth
User
Beiträge: 1749
Registriert: Samstag 16. April 2011, 12:47

Sowas kann man sich gut mit Wahrheitstabellen verdeutlichen: Ja, es ist ein exklusives Oder (XOR).

XOR gibt es in python auch, jedoch nur als bitwise operator (^), daher finde ich es eher ungewöhnlich, den hier zu nehmen, auch wenn aus technischen Gründen in dem Fall das Richtige rauskommt:

Code: Alles auswählen

In [8]: for p, q in itertools.product((True, False), repeat=2):
   ...:     print(f"{p} ^ {q}: {p^q}")
   ...: 
True ^ True: False
True ^ False: True
False ^ True: True
False ^ False: False

In [9]: for p, q in itertools.product((True, False), repeat=2):
   ...:     print(f"({p} or {q}) and not ({p} and {q}): {(p or q) and not (p and q)}")
   ...: 
(True or True) and not (True and True): False
(True or False) and not (True and False): True
(False or True) and not (False and True): True
(False or False) and not (False and False): False

In [10]: for p, q in itertools.product((True, False), repeat=2):
    ...:     print(f"{p}  {q}:",   ((p or q) and not (p and q)) == p ^ q)
    ...: 
True  True: True
True  False: True
False  True: True
False  False: True
Ob es die richte Wahl für deinen Zweck ist, musst du aber einschätzen.
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

pillmuncher hat geschrieben: Freitag 9. August 2024, 18:44 [/code]Wenn es sicher ist, dass du xor verwenden möchtest und dass die d.aufsteiger immer bool sind, kannst du einfach das hier benutzen:

Code: Alles auswählen

if duellant_1.aufsteiger != duellant_2.aufsteiger:
Stimmt, müsste eigentlich auch funktionieren - muss ich mal drüber hirnen (oder ausprobieren).
(Wenn keiner Aufsteiger ist oder beide passiert hier erstmal nix.)
Antworten