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
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top