Überprüfen Sie, ob nur eine Variable in einer Liste von Variablen gesetzt

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich bin auf der Suche nach einer einfachen Methode zu überprüfen, ob nur eine Variable in einer Liste von Variablen einen Wert True hat. Ich habe in dieser logische xor Post und versucht, einen Weg zu finden, um mehrere Variablen und nur einen wahren.

anpassen

Beispiel

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

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

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

>>>TrueXor(0,0,0,0,0)
False
War es hilfreich?

Lösung

Es gibt einen nicht gebaut, aber es ist nicht zu schwer rollen Sie besitzen:

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

Da "[b] ooleans ist ein Subtyp von einfachen ganzen Zahlen" ( Quelle ) können Sie die Liste der ganzen Zahlen summieren kann ganz einfach und man kann auch wahr booleans in dieser Funktion auch passieren.

So sind diese beiden Anrufe sind homogen:

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

Wenn Sie explizite boolean Konvertierung. sum( bool(x) for x in args ) == 1

Andere Tipps

Ich denke, die Summe-basierte Lösung für das gegebene Beispiel ist in Ordnung, aber bedenken Sie, dass Prädikate in Python immer Kurzschluss ihre Auswertung boolean. So möchten Sie vielleicht etwas mehr im Einklang mit alle und jeden berücksichtigen.

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
>>>

Die Frage, die Sie bereits verbunden bietet die Lösung für zwei Variablen. Alles, was Sie tun müssen, ist erweitert es auf n Variablen arbeiten:

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

Hier ist mein direkter Ansatz. Ich habe es umbenannt only_one seit xor mit mehr als einem Eingang in der Regel ein Paritätsprüfer ist, kein „nur ein“ Checker.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top