Controlla se è impostata solo una variabile in un elenco di variabili
Domanda
Sto cercando un metodo semplice per verificare se solo una variabile in un elenco di variabili ha un valore True. Ho visto questo xor logico post e sta cercando di trovare un modo per adattarsi a più variabili e solo una vera.
Esempio
>>>TrueXor(1,0,0)
True
>>>TrueXor(0,0,1)
True
>>>TrueXor(1,1,0)
False
>>>TrueXor(0,0,0,0,0)
False
Soluzione
Non ce n'è uno integrato ma non è difficile implementare il tuo:
def TrueXor(*args):
return sum(args) == 1
Poiché " [b] ooleans sono un sottotipo di interi semplici " ( source ) puoi sommare il elenco di numeri interi abbastanza facilmente e puoi anche passare veri booleani a questa funzione.
Quindi queste due chiamate sono omogenee:
TrueXor(1, 0, 0)
TrueXor(True, False, False)
Se vuoi una conversione booleana esplicita: sum (bool (x) per x in args) == 1
.
Altri suggerimenti
Penso che la soluzione basata sulla somma vada bene per l'esempio dato, ma tieni presente che i predicati booleani in Python mettono sempre in corto circuito la loro valutazione. Quindi potresti voler considerare qualcosa di più coerente con tutto e qualsiasi .
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 domanda a cui hai collegato fornisce già la soluzione per due variabili. Tutto quello che devi fare è estenderlo per lavorare su n variabili:
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
Ecco il mio approccio diretto. L'ho rinominato only_one dal momento che xor con più di un input è di solito un controllo di parità, non un "solo" " 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