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
¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top