Question

Je cherche une méthode simple pour vérifier si une seule variable dans une liste de variables a une valeur True. J'ai consulté cette xor logique. post et tente de trouver un moyen de s’adapter à plusieurs variables et à une seule vraie.

Exemple

>>>TrueXor(1,0,0)
True

>>>TrueXor(0,0,1)
True

>>>TrueXor(1,1,0)
False

>>>TrueXor(0,0,0,0,0)
False
Était-ce utile?

La solution

Il n’existe pas de solution intégrée, mais il n’est pas trop difficile d’être acquis:

def TrueXor(*args):
    return sum(args) == 1

Étant donné que "[b] ooliennes sont un sous-type d'entiers normaux" ( source ), vous pouvez additionner le liste d’entiers assez facilement et vous pouvez également transmettre de vrais booléens à cette fonction.

Ces deux appels sont donc homogènes:

TrueXor(1, 0, 0)
TrueXor(True, False, False)

Si vous souhaitez une conversion booléenne explicite: sum (bool (x) pour x dans les arguments) == 1 .

Autres conseils

Je pense que la solution basée sur la somme est correcte pour l'exemple donné, mais gardez à l'esprit que les prédicats booléens en python court-circuitent toujours leur évaluation. Donc, vous voudrez peut-être envisager quelque chose de plus compatible avec 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 question à laquelle vous avez lié fournit déjà la solution pour deux variables. Tout ce que vous avez à faire est de l’étendre pour travailler sur 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

Voici mon approche directe. Je l'ai renommé only_one depuis que xor avec plus d'une entrée est généralement un vérificateur de parité, et non un "seul". vérificateur.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top