GOOGLE ADS

Mittwoch, 13. April 2022

Wie testet man mehrere Variablen auf Gleichheit mit einem einzigen Wert?

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:

xund ywerden ansonsten eigenständig ausgewertet ( Falseif 0, Truesonst).

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 ines 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 == 1wird zuerst als boolescher Test für behandelt x, wenn dieser False ist, wird der Ausdruck y == 1getestet.

Dies liegt an der Operatorpriorität. Der orOperator 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 == 1tatsächlich als (x or y or z) == 1stattdessen interpretiert würde, würde dies immer noch nicht das tun, was Sie erwarten.

x or y or zwü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 = 0würde also x or y or zzu aufgelöst 2werden, da dies der erste True-Like-Wert in den Argumenten ist. Dann 2 == 1wäre False, obwohl y == 1wäre True.

Dasselbe würde für die Umkehrung gelten; Testen mehrerer Werte gegen eine einzelne Variable; x == 1 or 2 or 3würde aus den gleichen Gründen scheitern. Verwenden Sie x == 1 or x == 2 or x == 3oder x in {1, 2, 3}.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...