Ich versuche, eine Funktion zu erstellen, die mehrere Variablen mit einer Ganzzahl vergleicht und eine Zeichenfolge aus drei Buchstaben ausgibt. Ich habe mich gefragt, ob es eine Möglichkeit gibt, dies in Python zu übersetzen. Sozusagen:
x = 0
y = 1
z = 3
mylist = []
if x or y or z == 0:
mylist.append("c")
if x or y or z == 1:
mylist.append("d")
if x or y or z == 2:
mylist.append("e")
if x or y or z == 3:
mylist.append("f")
was eine Liste zurückgeben würde von:
["c", "d", "f"]
Ist so etwas möglich?
Lösung des Problems
Sie missverstehen, wie boolesche Ausdrücke funktionieren; Sie funktionieren nicht wie ein englischer Satz und vermuten, dass Sie hier über denselben Vergleich für alle Namen sprechen. Du suchst nach:
if x == 1 or y == 1 or z == 1:
x
und y
werden ansonsten eigenständig ausgewertet ( False
if 0
, True
sonst).
Sie können dies mit einem Containment-Test gegen ein Tupel verkürzen:
if 1 in (x, y, z):
oder noch besser:
if 1 in {x, y, z}:
Verwenden von aset
, um den Zugehörigkeitstest mit konstanten Kosten zu nutzen (dh in
es dauert eine feste Zeit, unabhängig vom Operanden auf der linken Seite).
Erläuterung
Wenn Sie verwenden or
, sieht Python jede Seite des Operators als separate Ausdrücke. Der Ausdruck x or y == 1
wird zuerst als boolescher Test für behandelt x
, wenn dieser False ist, wird der Ausdruck y == 1
getestet.
Dies liegt an der Operatorpriorität. Der or
Operator hat eine niedrigere Priorität als der ==
Test, daher wird letzterer zuerst ausgewertet.
Aber selbst wenn dies nicht der Fall wäre und der Ausdruck x or y or z == 1
tatsächlich als (x or y or z) == 1
stattdessen interpretiert würde, würde dies immer noch nicht das tun, was Sie erwarten.
x or y or z
würde zum ersten Argument ausgewertet werden, das 'wahr' ist, z. B. not False
, numerisch 0 oder leer (siehe Boolesche Ausdrücke für Details darüber, was Python in einem booleschen Kontext als falsch betrachtet).
Für die Werte x = 2; y = 1; z = 0
würde also x or y or z
zu aufgelöst 2
werden, da dies der erste True-Like-Wert in den Argumenten ist. Dann 2 == 1
wäre False
, obwohl y == 1
wäre True
.
Dasselbe würde für die Umkehrung gelten; Testen mehrerer Werte gegen eine einzelne Variable; x == 1 or 2 or 3
würde aus den gleichen Gründen scheitern. Verwenden Sie x == 1 or x == 2 or x == 3
oder x in {1, 2, 3}
.
Keine Kommentare:
Kommentar veröffentlichen