it-swarm.com.de

Wie teste ich mehrere Variablen gegen einen Wert?

Ich versuche, eine Funktion zu erstellen, die mehrere Variablen mit einer Ganzzahl vergleicht und eine Folge von drei Buchstaben ausgibt. Ich habe mich gefragt, ob es einen Weg 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")

das würde eine Liste von zurückgeben 

["c", "d", "f"]

Ist so etwas möglich?

494
user1877442

Sie verstehen falsch, wie boolesche Ausdrücke funktionieren. Sie funktionieren nicht wie ein englischer Satz und vermuten, dass Sie hier für alle Namen über den gleichen Vergleich sprechen. Du suchst nach:

if x == 1 or y == 1 or z == 1:

x und y werden ansonsten alleine ausgewertet (False wenn 0, True sonst).

Sie können das mit einem Containment-Test gegen ein Tuple abkürzen.

if 1 in (x, y, z):

oder noch besser:

if 1 in {x, y, z}:

verwenden von einer set , um den Mitgliedschaftstest mit konstanten Kosten zu nutzen (in benötigt eine festgelegte Zeit, unabhängig vom linken Operanden).

Wenn Sie or verwenden, sieht Python jede Seite des Operators als separate -Ausdrücke. Der Ausdruck x or y == 1 wird als erster boolescher Test für x behandelt. Wenn dies False ist, wird der Ausdruck y == 1 getestet.

Dies liegt an dem Vorrang von Operator . Der or-Operator hat eine niedrigere Priorität als der ==-Test, daher wird der letztere first ausgewertet.

Selbst wenn dies jedoch nicht war und stattdessen der Ausdruck x or y or z == 1 tatsächlich als (x or y or z) == 1 interpretiert wurde, würde dies immer noch nicht das tun, was Sie erwarten. 

x or y or z würde das erste Argument als "wahr" bewerten, z. nicht False, numerisch 0 oder leer (siehe boolesche Ausdrücke für Details darüber, was Python in einem booleschen Kontext für falsch hält).

Für die Werte x = 2; y = 1; z = 0 würde sich x or y or z in 2 auflösen, da dies der erste wahrheitsähnliche Wert in den Argumenten ist. Dann wäre 2 == 1False, auch wenn y == 1True wäre.

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

669
Martijn Pieters

Ihr Problem lässt sich leichter mit einer Wörterbuchstruktur wie:

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
78
dansalmo

Vorherige Lösung: Wie von Martijn Pieters angegeben, lautet das korrekte und schnellste Format:

if 1 in {x, y, z}:

Das eine Hauptproblem, das nicht angesprochen zu sein scheint, besteht darin, dass Ihre Ausgabeliste jeden Buchstaben nach einer True-Anweisung enthalten soll. 

Nach dem Rat von Martijn Pieters hätten Sie jetzt:

if 0 in {x, y, z}:
    Mylist.append("c")
Elif 1 in {x, y, z}:
    Mylist.append("d")
...

Problem: Die erste if-Anweisung würde true zurückgeben, und Sie würden niemals zur folgenden Elif-Anweisung gelangen. Ihre Liste würde also einfach zurückkehren:

["c"]

Sie möchten separate if-Anweisungen haben, damit Python jede Anweisung lesen kann, unabhängig davon, ob die vorigen Aussagen wahr oder falsch waren. Sowie:

if 0 in {x, y, z}:
    Mylist.append("c")
if 1 in {x, y, z}:
    Mylist.append("d")
if 2 in {x, y, z}:
    Mylist.append("e")
...

Das wird funktionieren, aber wenn Sie mit Wörterbüchern vertraut sind (siehe, was ich dort gemacht habe), können Sie dies bereinigen, indem Sie ein anfängliches Wörterbuch erstellen, das die Zahlen den gewünschten Buchstaben zuordnet.

numToLetters = {0:"c", 1:"d", 2:"e", 3:"f"}
for number in numToLetters:
    if number in {x, y, z}:
        Mylist.append(numToLetters[number])
51
ThatGuyRussell

Der direkte Weg, x or y or z == 0 zu schreiben, ist

if any(map((lambda value: value == 0), (x,y,z))):
    pass # write your logic.

Aber ich glaube nicht, dass es dir gefällt. Und dieser Weg ist hässlich.

Der andere Weg (ein besserer) ist:

0 in (x, y, z)

Übrigens könnten viele ifs so etwas geschrieben werden

my_cases = {
    0: Mylist.append("c"),
    1: Mylist.append("d")
    # ..
}

for key in my_cases:
    if key in (x,y,z):
        my_cases[key]()
        break
36
akaRem

Wenn Sie sehr faul sind, können Sie die Werte in ein Array einfügen. Sowie

list = []
list.append(x)
list.append(y)
list.append(z)
nums = [add numbers here]
letters = [add corresponding letters here]
for index in range(len(nums)):
    for obj in list:
        if obj == num[index]:
            MyList.append(letters[index])
            break

Sie können auch die Zahlen und Buchstaben in ein Wörterbuch einfügen und es tun, aber dies ist wahrscheinlich viel komplizierter als einfache if-Anweisungen. Das ist es, was Sie bekommen, wenn Sie versuchen, besonders faul zu sein :)

Eine weitere Sache, deine 

if x or y or z == 0:

wird kompilieren, aber nicht so, wie Sie es möchten. Wenn Sie einfach eine Variable in eine if-Anweisung einfügen (Beispiel)

if b

das Programm überprüft, ob die Variable nicht null ist. Eine andere Möglichkeit, die obige Aussage zu schreiben (was mehr Sinn macht) ist 

if bool(b)

Bool ist eine eingebaute Funktion in Python, die im Grunde den Befehl zur Überprüfung einer booleschen Anweisung ausführt (wenn Sie nicht wissen, was das ist, versuchen Sie es gerade mit Ihrer if-Anweisung zu machen :))

Ein anderer fauler Weg, den ich gefunden habe, ist:

if any([x==0, y==0, z==0])
26
ytpillai

Um zu überprüfen, ob ein Wert in einem Satz von Variablen enthalten ist, können Sie die eingebauten Module itertools und operator verwenden.

Zum Beispiel:

Importe:

from itertools import repeat
from operator import contains

Variablen deklarieren:

x = 0
y = 1
z = 3

Erstellen Sie eine Zuordnung von Werten (in der Reihenfolge, die Sie überprüfen möchten):

check_values = (0, 1, 3)

Verwenden Sie itertools, um die Wiederholung der Variablen zuzulassen:

check_vars = repeat((x, y, z))

Verwenden Sie schließlich die Funktion map, um einen Iterator zu erstellen:

checker = map(contains, check_vars, check_values)

Wenn Sie dann nach den Werten (in der ursprünglichen Reihenfolge) suchen, verwenden Sie next():

if next(checker)  # Checks for 0
    # Do something
    pass
Elif next(checker)  # Checks for 1
    # Do something
    pass

usw...

Dies hat einen Vorteil gegenüber lambda x: x in (variables), da operator ein integriertes Modul ist und schneller und effizienter ist als lambda, das eine benutzerdefinierte In-Place-Funktion erstellen muss.

Eine weitere Option zum Überprüfen, ob eine Liste einen Wert ungleich Null (oder False) enthält:

not (x and y and z)

Äquivalent:

not all((x, y, z))
24
GuiltyDolphin

Alle ausgezeichneten Antworten konzentrieren sich auf die spezifischen Anforderungen des Originalplakats und konzentrieren sich auf die von Martijn Pieters vorgeschlagene if 1 in {x,y,z}-Lösung.
Was sie ignorieren, ist die umfassendere Implikation der Frage:
Wie teste ich eine Variable gegen mehrere Werte?
.__ Die bereitgestellte Lösung funktioniert nicht für Teiltreffer, wenn Sie beispielsweise Zeichenfolgen verwenden:
Testen Sie, ob die Zeichenfolge "Wild" mehrere Werte enthält

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
... 

oder

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
... 

für dieses Szenario ist es am einfachsten, in eine Zeichenfolge zu konvertieren

>>> [x, y, z]
['Wild things', 'throttle it back', 'in the beginning']
>>> {x, y, z}
{'in the beginning', 'throttle it back', 'Wild things'}
>>> 

>>> if "Wild" in str([x, y, z]): print (True)
... 
True
>>> if "Wild" in str({x, y, z}): print (True)
... 
True

Es sei jedoch darauf hingewiesen, dass, wie von @codeforester erwähnt, Word-Grenzen mit dieser Methode verloren gehen, wie in: 

>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
... 
True

die 3 Buchstaben rot existieren in der Liste in Kombination, jedoch nicht als einzelnes Wort. Das Testen auf "Fäulnis" würde fehlschlagen, aber wenn eines der Listenelemente "Fäulnis in der Hölle" wäre, würde dies ebenfalls fehlschlagen.
Seien Sie vorsichtig mit Ihren Suchkriterien, wenn Sie diese Methode verwenden, und beachten Sie, dass es diese Einschränkung gibt.

22
Rolf of Saxony

Wenn Sie if verwenden möchten, sind die folgenden Anweisungen eine andere Lösung:

myList = []
aList = [0, 1, 3]

for l in aList:
    if l==0: myList.append('c')
    Elif l==1: myList.append('d')
    Elif l==2: myList.append('e')
    Elif l==3: myList.append('f')

print(myList)
22
paarsa

Ich denke, das wird besser damit umgehen:

my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}

def validate(x, y, z):
    for ele in [x, y, z]:
        if ele in my_dict.keys():
            return my_dict[ele]

Ausgabe:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
22
Bhargav Boda

Set ist der gute Ansatz hier, weil er die Variablen anordnet, was hier Ihr Ziel zu sein scheint. {z,y,x} ist {0,1,3}, unabhängig von der Reihenfolge der Parameter.

>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']

Auf diese Weise ist die gesamte Lösung O (n).

22
B. M.

Dieser Code kann hilfreich sein

L ={x, y, z}
T= ((0,"c"),(1,"d"),(2,"e"),(3,"f"),)
List2=[]
for t in T :
if t[0] in L :
    List2.append(t[1])
    break;
19
michael zxc858
d = {0:'c', 1:'d', 2:'e', 3: 'f'}
x, y, z = (0, 1, 3)
print [v for (k,v) in d.items() if x==k or y==k or z==k]
19
Saksham Varma

Einzeilige Lösung:

mylist = [{0: 'c', 1: 'd', 2: 'e', 3: 'f'}[i] for i in [0, 1, 2, 3] if i in (x, y, z)]

Oder:

mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]

Sie können die unten gezeigte Methode ausprobieren. Bei dieser Methode können Sie die Anzahl der Variablen angeben/eingeben, die Sie eingeben möchten.

mydict = {0:"c", 1:"d", 2:"e", 3:"f"}
mylist= []

num_var = int(raw_input("How many variables? ")) #Enter 3 when asked for input.

for i in range(num_var): 
    ''' Enter 0 as first input, 1 as second input and 3 as third input.'''
    globals()['var'+str('i').zfill(3)] = int(raw_input("Enter an integer between 0 and 3 "))
    mylist += mydict[globals()['var'+str('i').zfill(3)]]

print mylist
>>> ['c', 'd', 'f']
3

Das wird dir helfen.

def test_fun(val):
    x = 0
    y = 1
    z = 2
    myList = []
    if val in (x, y, z) and val == 0:
        myList.append("C")
    if val in (x, y, z) and val == 1:
        myList.append("D")
    if val in (x, y, z) and val == 2:
        myList.append("E")

test_fun(2);
3
Mayur

Es kann einfach so gemacht werden 

for value in [var1,var2,var3]:
     li.append("targetValue")
2
Seenivasan

Sieht aus, als würden Sie eine Caesar-Chiffre bauen.

Ein viel allgemeinerer Ansatz lautet:

input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]

ausgänge

['c', 'd', 'f']

Nicht sicher, ob es sich um einen gewünschten Nebeneffekt Ihres Codes handelt, aber die Reihenfolge Ihrer Ausgabe wird immer sortiert.

Wenn Sie dies wünschen, können Sie die letzte Zeile wie folgt ändern:

sorted([chr(val + origo) for val in inputs])
1
firelynx

So testen Sie mehrere Variablen mit einem einzigen Wert: if 1 in {a,b,c}:

So testen Sie mehrere Werte mit einer Variablen: if a in {1, 2, 3}:

1

Die mnemonischste Art, Ihren Pseudo-Code in Python darzustellen, wäre:

x = 0
y = 1
z = 3
mylist = []

if any(v == 0 for v in (x, y, z)):
    mylist.append("c")
if any(v == 1 for v in (x, y, z)):
    mylist.append("d")
if any(v == 2 for v in (x, y, z)):
    mylist.append("e")
if any(v == 3 for v in (x, y, z)):
    mylist.append("f")
1
rsalmei

Möglicherweise benötigen Sie eine direkte Formel für die gesetzten Ausgangsbits.

x = 0 oder y = 0 oder z = 0 ist äquivalent zu xy z = 0

x = 1 oder y = 1 oder z = 1 ist äquivalent zu (x-1) (y-1) (z-1) = 0

x = 2 oder y = 2 oder z = 2 ist äquivalent zu (x-2) (y-2) (z-2) = 0

lässt sich Bits zuordnen: 'c': 1 'd': 0xb10 'e': 0xb100 'f': 0xb1000

beziehung von isc:

wenn xyz = 0, ist isc = 1, andernfalls isc = 0

verwenden Sie die mathematische Formel https://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315

[c]: (xyz = 0 und isc = 1) oder (((xyz = 0 und isc = 1) oder (isc = 0)) und (isc = 0))

[d]: ((x-1) (y-1) (z-1) = 0 und isc = 2) oder (((xyz = 0 und isd = 2) oder (isc = 0)) und (isc = 0))

...

verbinden Sie diese Formeln durch folgende Logik:

logik und ist die Summe der Quadrate der Gleichungen

logik oder ist ein Produkt von Gleichungen

und du hast eine Gesamtgleichung

summe ausdrücken und Sie haben die Summenformel

dann ist Summe & 1 c, Summe & 2 ist d, Summe & 4 ist e, Summe & 5 ist f

danach können Sie ein vordefiniertes Array bilden, in dem der Index des String-Elements dem Ready-String entsprechen würde.

array [Summe] gibt die Zeichenfolge an.

0
Sergei

Sie können Wörterbuch verwenden:

x = 0
y = 1
z = 3
list=[]
dict = {0: 'c', 1: 'd', 2: 'e', 3: 'f'}
if x in dict:
    list.append(dict[x])
else:
    pass

if y in dict:
    list.append(dict[y])
else:
    pass
if z in dict:
    list.append(dict[z])
else:
    pass

print list
0
Rohit Gawas