Compruebe si solo se establece una variable en una lista de variables
Pregunta
Estoy buscando un método simple para verificar si solo una variable en una lista de variables tiene un valor Verdadero. He mirado esto xor lógico post e intenta encontrar una manera de adaptarse a múltiples variables y solo una verdadera.
Ejemplo
>>>TrueXor(1,0,0)
True
>>>TrueXor(0,0,1)
True
>>>TrueXor(1,1,0)
False
>>>TrueXor(0,0,0,0,0)
False
Solución
No hay uno integrado, pero no es difícil rodar el tuyo:
def TrueXor(*args):
return sum(args) == 1
Dado que " [b] ooleans son un subtipo de enteros simples " ( fuente ) puede sumar el lista de enteros con bastante facilidad y también puede pasar booleanos verdaderos a esta función también.
Entonces estas dos llamadas son homogéneas:
TrueXor(1, 0, 0)
TrueXor(True, False, False)
Si desea una conversión booleana explícita: sum (bool (x) para x en args) == 1
.
Otros consejos
Creo que la solución basada en la suma está bien para el ejemplo dado, pero tenga en cuenta que los predicados booleanos en python siempre provocan un cortocircuito en su evaluación. Por lo tanto, es posible que desee considerar algo más coherente con all and any .
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
>>>
La pregunta a la que se vinculó ya proporciona la solución para dos variables. Todo lo que tiene que hacer es extenderlo para que funcione en n variables:
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
Aquí está mi enfoque directo. Lo renombré only_one ya que xor con más de una entrada suele ser un verificador de paridad, no un " solo uno " corrector.
def only_one(*args):
result = False
for a in args:
if a:
if result:
return False
else:
result = True
return result
Pruebas:
>>> 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