Verifique se apenas uma variável em uma lista de variáveis ??é definido

StackOverflow https://stackoverflow.com/questions/1032411

  •  06-07-2019
  •  | 
  •  

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
Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top