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?
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 == 1
False
, auch wenn y == 1
True
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}
.
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]]
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])
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 if
s 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
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])
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))
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.
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)
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
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).
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;
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]
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']
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);
Es kann einfach so gemacht werden
for value in [var1,var2,var3]:
li.append("targetValue")
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])
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}:
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")
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.
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