Überprüfen Sie, ob nur eine Variable in einer Liste von Variablen gesetzt
Frage
Ich bin auf der Suche nach einer einfachen Methode zu überprüfen, ob nur eine Variable in einer Liste von Variablen einen Wert True hat. Ich habe in dieser logische xor Post und versucht, einen Weg zu finden, um mehrere Variablen und nur einen wahren.
anpassenBeispiel
>>>TrueXor(1,0,0)
True
>>>TrueXor(0,0,1)
True
>>>TrueXor(1,1,0)
False
>>>TrueXor(0,0,0,0,0)
False
Lösung
Es gibt einen nicht gebaut, aber es ist nicht zu schwer rollen Sie besitzen:
def TrueXor(*args):
return sum(args) == 1
Da "[b] ooleans ist ein Subtyp von einfachen ganzen Zahlen" ( Quelle ) können Sie die Liste der ganzen Zahlen summieren kann ganz einfach und man kann auch wahr booleans in dieser Funktion auch passieren.
So sind diese beiden Anrufe sind homogen:
TrueXor(1, 0, 0)
TrueXor(True, False, False)
Wenn Sie explizite boolean Konvertierung. sum( bool(x) for x in args ) == 1
Andere Tipps
Ich denke, die Summe-basierte Lösung für das gegebene Beispiel ist in Ordnung, aber bedenken Sie, dass Prädikate in Python immer Kurzschluss ihre Auswertung boolean. So möchten Sie vielleicht etwas mehr im Einklang mit alle und jeden berücksichtigen.
def any_one(iterable):
it = iter(iterable)
return any(it) and not any(it)
>>> def f(*n):
... n = [bool(i) for i in n]
... return n.count(True) == 1
...
>>> f(0, 0, 0)
False
>>> f(1, 0, 0)
True
>>> f(1, 0, 1)
False
>>> f(1, 1, 1)
False
>>> f(0, 1, 0)
True
>>>
Die Frage, die Sie bereits verbunden bietet die Lösung für zwei Variablen. Alles, was Sie tun müssen, ist erweitert es auf n Variablen arbeiten:
import operator
def only_one_set(*vars):
bools = [bool(v) for v in vars]
return reduce(operator.xor, bools, False)
>>> a, b, c, d, e = False, '', [], 10, -99
>>> only_one_set(a, b, c, d)
True
>>> only_one_set(a, b, c, d, e)
False
Hier ist mein direkter Ansatz. Ich habe es umbenannt only_one seit xor mit mehr als einem Eingang in der Regel ein Paritätsprüfer ist, kein „nur ein“ Checker.
def only_one(*args):
result = False
for a in args:
if a:
if result:
return False
else:
result = True
return result
Test:
>>> only_one(1,0,0)
True
>>> only_one(0,0,1)
True
>>> only_one(1,1,0)
False
>>> only_one(0,0,0,0,0)
False
>>> only_one(1,1,0,1)
False