Verifique se apenas uma variável em uma lista de variáveis ??é definido
Pergunta
Eu estou procurando um método simples para verificar se apenas uma variável em uma lista de variáveis ??tem um valor True. Eu olhei lógica XOR este postar e está tentando encontrar uma maneira de se adaptar às diversas variáveis ??e apenas uma verdade.
Exemplo
>>>TrueXor(1,0,0)
True
>>>TrueXor(0,0,1)
True
>>>TrueXor(1,1,0)
False
>>>TrueXor(0,0,0,0,0)
False
Solução
Não há um construído em, mas não é muito difícil de rolar você possui:
def TrueXor(*args):
return sum(args) == 1
Uma vez que "[b] ooleans são um subtipo de inteiros simples" ( fonte ) você pode somar a lista de números inteiros muito facilmente e você também pode passar verdadeiros booleans para esta função também.
Então, essas duas chamadas são homogêneos:
TrueXor(1, 0, 0)
TrueXor(True, False, False)
Se você quiser conversão boolean explícito:. sum( bool(x) for x in args ) == 1
Outras dicas
Eu acho que a solução baseada na soma é bom para o exemplo dado, mas tenha em mente que os predicados booleanos em python sempre curto-circuito sua avaliação. Então você pode querer considerar algo mais consistente com toda e qualquer .
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
>>>
A pergunta que você já ligados a fornece a solução para duas variáveis. Tudo que você tem a fazer é estendê-lo para trabalhar em n variáveis:
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
Aqui está a minha abordagem direta. Eu rebatizou-apenas_um desde XOR com mais de uma entrada é geralmente um verificador de paridade, e não um "apenas um" verificador.
def only_one(*args):
result = False
for a in args:
if a:
if result:
return False
else:
result = True
return result
Testing:
>>> 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