Come si ottiene lo xor logico di due variabili in Python?


648

Come si ottiene lo xor logico di due variabili in Python?

Ad esempio, ho due variabili che mi aspetto siano stringhe. Voglio provare che solo uno di essi contiene un valore True (non è None o la stringa vuota):

str1 = raw_input("Enter string one:")
str2 = raw_input("Enter string two:")
if logical_xor(str1, str2):
    print "ok"
else:
    print "bad"

L' ^operatore sembra essere bit a bit e non definito su tutti gli oggetti:

>>> 1 ^ 1
0
>>> 2 ^ 1
3
>>> "abc" ^ ""
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for ^: 'str' and 'str'

3
Come definisci "xor" per un paio di stringhe? Cosa pensi che "abc" ^ "" dovrebbe restituire che non lo fa?
Mehrdad Afshari,

18
Dovrebbe restituire True, piuttosto che sollevare un'eccezione, poiché solo una delle stringhe è True, come definito dal normale tipo bool di Python.
Zach Hirsch,

38
Sono sorpreso che Python non abbia un operatore infix chiamato "xor", che sarebbe l'implementazione Pythonic più intuitiva. L'uso di "^" è coerente con altre lingue, ma non è così palesemente leggibile come la maggior parte di Python.
Mark E. Haase,

13
@MehrdadAfshari La risposta ovvia alla tua domanda è che a xor aè definita come (a and not b) or (not a and b), e quindi a xor b, quando ae bsono stringhe di caratteri, o qualsiasi altro tipo, dovrebbero produrre qualunque (a and not b) or (not a and b)resa.
Kaz,

1
Il problema è che la documentazione è scarsa. ^ è "bitwise exclusive or", che letteralmente interpretato significa bit per bit, non bool by bool. quindi x'FFFF00 '^ x'FFFF00' dovrebbe essere x'000000 '. O questo è destinato a verificarsi solo su base char? espressi come numeri? Dobbiamo iterare i caratteri di stringa più corti in modo che corrispondano alla lunghezza della stringa più lunga. Tutto questo dovrebbe essere integrato.
mckenzm

Risposte:


1188

Se stai già normalizzando gli input in booleani, allora! = È xor.

bool(a) != bool(b)

148
Anche se questo è intelligente e breve, non sono convinto che sia pulito. Quando qualcuno legge questo costrutto nel codice, è immediatamente ovvio per loro che si tratta di un'operazione xor? Mi sono sentito obbligato ad aggiungere un commento - un segno per me che sto scrivendo un codice poco chiaro e provo a scusarmi con un commento.

47
Forse "è chiaro che è un XOR?" è la domanda sbagliata. Stavamo solo cercando di vedere se la risposta a due domande fosse la stessa, e pensando che avremmo usato XOR per implementarla. Ad esempio, se vogliamo assicurarci che non stiamo confrontando le mele con le arance, "se xor (isApple (x), isApple (y))" è davvero più chiaro di "se isApple (x)! = IsApple (y)"? Non a me!
AmigoNico,

106
Si è verificato un problema con l'utilizzo di "! =" Come xor. Probabilmente ti aspetteresti che bool (a)! = Bool (b)! = Bool (c) sia uguale a bool (a) ^ bool (b) ^ bool (c). Quindi lancia i bool, ma consiglierei ^. Per sapere cosa succede nel primo esempio, cercare "concatenamento operatore".
elmo,

19
@elmo: +1 per sottolineare la differenza e +1 per insegnarmi cos'è il concatenamento dell'operatore! Sono nel campo che dice che! = Non è leggibile come ^.
Mark E. Haase,

13
dovrebbe essere bool(a) is not bool(b)invece?
RNA

485

Puoi sempre usare la definizione di xor per calcolarlo da altre operazioni logiche:

(a and not b) or (not a and b)

Ma questo è un po 'troppo prolisso per me e non è particolarmente chiaro a prima vista. Un altro modo per farlo è:

bool(a) ^ bool(b)

L'operatore xor su due booleani è xor logico (a differenza di ints, dove è bit a bit). Il che ha senso, poiché boolè solo una sottoclasse diint , ma è implementato per avere solo i valori 0e 1. E xor logico equivale a xor bit a bit quando il dominio è limitato a 0e 1.

Quindi la logical_xorfunzione sarebbe implementata come:

def logical_xor(str1, str2):
    return bool(str1) ^ bool(str2)

Ringraziamo Nick Coghlan nella mailing list di Python-3000 .


7
ottimo post, ma di tutti i modi per nominare i parametri, perché 'str1' e 'str2'?
SingleNegationElimination

1
@Token perché no. Intendi perché non sono molto Pythonic?
Orokusaki,

1
@Zach Hirsch Potresti usare (non a e b) invece di (b e non a) per la leggibilità o la definizione sarebbe incoerente con xor.
Orokusaki,

10
Dovresti mettere prima le nots in questo (not b and a) or (not a and b)modo in modo che restituisca la stringa se ce n'era una, che sembra il modo pitonico per far funzionare la funzione.
rjmunro,

2
@TokenMacGuy: Cosa stavi suggerendo che avrebbe dovuto chiamarli invece?
user541686

180

Bitwise esclusivo o è già integrato in Python, nel operatormodulo (che è identico ^all'operatore):

from operator import xor
xor(bool(a), bool(b))  # Note: converting to bools is essential

3
Questo è quello di cui avevo bisogno. Quando si esegue il reverse engineering del malware molte volte le stringhe vengono modificate fino a un'operazione XOR. Usando questo chr (xor (ord ("n"), 0x1A)) = 't'
ril3y

75
Fai attenzione, anche questo è bit a bit: xor(1, 2)ritorna 3. Dalla documentazione: xor(a, b) -- Same as a ^ b. Ricorda che qualsiasi cosa importata da operatorè solo una forma funzionale di un operatore infix incorporato esistente.
askewchan,

5
@askewchan: il booltipo si sovraccarica __xor__per restituire valori booleani. Funzionerà bene, ma è eccessivo quando bool(a) ^ bool(b)fa esattamente la stessa cosa.
Martijn Pieters

@MartijnPieters L' ^operatore chiama __xor__internamente.
Quantum7,

5
@ Quantum7: sì, non sono sicuro del perché me lo stai dicendo. Ho appena detto che il booltipo implementa il __xor__metodo specificamente perché lo ^chiama . Il punto è che bool(a) ^ bool(b)funziona bene, non è necessario utilizzare la operator.xor()funzione qui.
Martijn Pieters

43

Come ha spiegato Zach , puoi usare:

xor = bool(a) ^ bool(b)

Personalmente, preferisco un dialetto leggermente diverso:

xor = bool(a) + bool(b) == 1

Questo dialetto è ispirato da un linguaggio logico di diagrammi che ho imparato a scuola in cui "OR" era indicato da una casella contenente ≥1(maggiore o uguale a 1) e "XOR" era indicato da una casella contenente =1.

Ciò ha il vantaggio di implementare correttamente esclusivi o su più operandi.

  • "1 = a ^ b ^ c ..." significa che il numero di operandi veri è dispari. Questo operatore è "parità".
  • "1 = a + b + c ..." significa che esattamente un operando è vero. Questo è "esclusivo o", che significa "uno ad esclusione degli altri".

12
Quindi, True + True + False + True == 3 e 3! = 1, ma True XOR True XOR False XOR True == True. Puoi approfondire "l'implementazione corretta di XOR su più operandi"?
martedì

3
@tzot Il tuo esempio fallisce, perché secondo la soluzione di ddaa, applichi l'aggiunta su solo due variabili alla volta. Quindi dovrebbe essere il modo giusto di scrivere tutto (((((True + True)==1)+False)==1)+True)==1. La risposta qui fornita si generalizza totalmente a più operandi.
ely,

6
Inoltre, c'è una differenza tra un gruppo XOR a tre vie e un gruppo di due XOR raggruppati in ordine di operazioni. Quindi 3-WAY-XOR (A, B, C) non è la stessa cosa di XOR (XOR (A, B), C). E l'esempio di ddaa è il primo, mentre il tuo assume il secondo.
ely,

3
@ Mr.F La tua spiegazione non scusa davvero questa risposta. In Python, se lo farete True + True + False + True, tu cosa ottenete 3, e True + True + False + True == 3restituisce Truementre True + True + False + True == 1restituisce False. In altre parole, la risposta qui non si generalizza correttamente; per farlo, è necessario fare un lavoro aggiuntivo. Nel frattempo un semplice True ^ True ^ False ^ Truefunziona come previsto.
jpmc26,

3
@ jpmc26 Non capisco il tuo commento. L'approccio di addizione ha lo scopo di generalizzare l'operazione in cui si desidera verificare che sia esattamente un operando True, un XOR multi-arity. Questa è un'operazione diversa rispetto, ad esempio, a A XOR B XOR ... XOR Z. In altre parole, se si prevede di utilizzare la versione basata sull'addizione, dopo l'invio gli operandi True + True + False + Truedovrebbero aspettarsi che il risultato sia Falsepiù di uno di questi True, che funziona se la condizione verifica == 1.
ely

26
  • Python logic or:: A or Brestituisce Aif bool(A)is True, altrimenti restituisceB
  • Python logic and:: A and Brestituisce Aif bool(A)is False, altrimenti restituisceB

Per mantenere la maggior parte di quel modo di pensare, la mia logica definizione xor sarebbe:

def logical_xor(a, b):
    if bool(a) == bool(b):
        return False
    else:
        return a or b

In questo modo si può tornare a, bo False:

>>> logical_xor('this', 'that')
False
>>> logical_xor('', '')
False
>>> logical_xor('this', '')
'this'
>>> logical_xor('', 'that')
'that'

5
Questo mi sembra negativo, o almeno strano. Nessuno degli altri operatori logici integrati restituisce uno dei tre valori possibili.
Zach Hirsch,

2
@Zach Hirsch: Ecco perché ho detto "di mantenere la maggior parte di quel modo di pensare" - dal momento che non ci sono buoni risultati quando entrambi sono veri o falsi
nosklo

L'operazione logica deve restituire un valore logico, quindi il secondo "return a o b" sembra strano, quindi il secondo return deve restituire True.
Denis Barmenkov

9
@Denis Barmenkov: Beh, nota che Python operatori logici ande ornon tornerà valore logico. 'foo' and 'bar'ritorna 'bar'...
nosklo

6
A prima vista, le 2 risposte precedenti sembrano le migliori, ma a ripensarci, questa è in realtà l'unica veramente corretta, ovvero è l'unica che fornisce un esempio di xorimplementazione coerente con il built-in ande or. Tuttavia, ovviamente, in situazioni pratiche bool(a) ^ bool(b)o addirittura a ^ b(se ae bsi sa che lo sonobool ) sono ovviamente più concise.
Erik Kaplun,

23

Ho testato diversi approcci e mi è not a != (not b)sembrato il più veloce.

Ecco alcuni test

%timeit not a != (not b)
10000000 loops, best of 3: 78.5 ns per loop

%timeit bool(a) != bool(b)
1000000 loops, best of 3: 343 ns per loop

%timeit not a ^ (not b)
10000000 loops, best of 3: 131 ns per loop

Modifica: gli esempi 1 e 3 sopra mancano le parentesi quindi il risultato non è corretto. Nuovi risultati + truth()funzione come suggerito da ShadowRanger.

%timeit  (not a) ^  (not b)   # 47 ns
%timeit  (not a) != (not b)   # 44.7 ns
%timeit truth(a) != truth(b)  # 116 ns
%timeit  bool(a) != bool(b)   # 190 ns

6
Sono 100 ns della mia vita che non tornerò indietro ;-)
Arel,

4
Per un intervallo intermedio, puoi farlo from operator import truthnella parte superiore del modulo e testare truth(a) != truth(b). boolessendo un costruttore ha un sacco di overhead inevitabile a livello C (deve accettare argomenti come equivalente *args, **kwargse analizzare il tuplee dictper estrarli), dove truth(essendo una funzione) può utilizzare un percorso ottimizzato che non richiede né una tupleo a dicte funziona in circa la metà del tempo rispetto alle boolsoluzioni basate (ma ancora più lungo rispetto alle notsoluzioni basate).
ShadowRanger,

9

Discussione gratificante:

Un'idea ancora ... Basta provare l'espressione pitonica (forse) «non è» per ottenere un comportamento «logico» o

La tabella della verità sarebbe:

>>> True is not True
False
>>> True is not False
True
>>> False is not True
True
>>> False is not False
False
>>>

E per la tua stringa di esempio:

>>> "abc" is not  ""
True
>>> 'abc' is not 'abc' 
False
>>> 'abc' is not '' 
True
>>> '' is not 'abc' 
True
>>> '' is not '' 
False
>>> 

Però; come indicato sopra, dipende dal comportamento effettivo che si desidera estrarre da qualsiasi coppia di stringhe, perché le stringhe non sono bolean ... e ancora di più: se si "Dive Into Python" troverai "The Peculiar Nature of" e "e" o "» http://www.diveintopython.net/power_of_introspection/and_or.html

Scusate il mio inglese scritto, non è la mia lingua nata.

Saluti.


Lo uso anche per leggerlo come "strettamente diverso". Questo perché alcuni linguaggi utilizzano per implementare l'operazione bit per bit della rappresentazione binaria e prendere il bool dell'operazione bit per bit risultante. Immagino che la tua risposta sia più "a prova di proiettile" perché si estende oltre lo spazio booleano.
yucer

Intendo il fatto che la tua risposta copre il caso del confronto tra Nessuno, Falso '', poiché la cosa distintiva è diversa. Ad esempio: bool (False)! = Bool ('') tuttavia False non è '' "concorda di più con questa semantica di" rigorosamente diverso "
yucer

8

Python ha un operatore OR bit a bit esclusivo, è ^:

>>> True ^ False
True
>>> True ^ True
False
>>> False ^ True
True
>>> False ^ False
False

Puoi usarlo convertendo gli input in booleani prima di applicare xor ( ^):

bool(a) ^ bool(b)

(Modificato - grazie Arel)


La tua risposta dovrebbe chiarire che ^è un xor bit per bit (non xor logico come la domanda posta). bool(2) ^ bool(3)dà una risposta diversa da bool(2 ^ 3).
Arel,

1
@Arel Ma non è così. a ^ bè polimorfo. Se ae bsono boolistanze, anche il risultato lo sarà bool. Questo comportamento difficilmente può essere definito un xor "bit a bit".
Alfe,

@Alfe il punto importante è che i valori devono prima essere lanciati in booleani. La documentazione di Python definisce ^bit a bit, anche se è un punto interessante per cui i tipi vengono conservati boole inttipi. Nota: True ^ 2è 3, dimostrando come sia effettivamente bit a bit.
Arel,

@Arel Sì, è il bool ^ intcaso di lanciare tutto per intprimo. Tuttavia, Python ha incorporato l' ^operatore per molti bit in inte per quello rappresentato in a bool, quindi entrambi sono bit a bit , ma lo xor bit a bit per un singolo bit è solo lo xor logico per i booleani.
Alfe,

Odio sempre usare questo operatore, anche se capisco che xorproviene da un background ingegneristico, questo istintivamente mi sembra un potere matematico, il 2^3 = pow(2,3)che significa che commento sempre esplicitamente per evitare confusione.
Nicholas Hamilton,

8

Dato che non vedo la semplice variante di xor che usa argomenti variabili e solo operazioni sui valori di Verità Vero o Falso, lo lancerò qui per essere usato da chiunque. È come notato da altri, piuttosto (per non dire molto) semplice.

def xor(*vars):
    sum = False
    for v in vars:
        sum = sum ^ bool(v)
    return sum

E anche l'uso è semplice:

if xor(False, False, True, False):
    print "Hello World!"

Dato che questo è lo XOR logico n-ary generalizzato, il suo valore di verità sarà True ogni volta che il numero di operandi True sarà dispari (e non solo quando esattamente uno è True, questo è solo un caso in cui X-nOR ary è True).

Quindi, se sei alla ricerca di un predicato n-ary che è True solo quando è esattamente uno dei suoi operandi, potresti voler usare:

def isOne(*vars):
    sum = False
    for v in vars:
        if sum and v:
            return False
        else:
            sum = sum or v
    return sum

Per migliorare questa risposta: (bool(False) is False) == True. Puoi semplicemente usare Falsesu quelle linee.
pathunstrom,

7

Esclusivo O è definito come segue

def xor( a, b ):
    return (a or b) and not (a and b)

2
che restituirebbe True per xor ('this', '') e per seguire la strada di Python, dovrebbe restituire 'this'.
nosklo,

@nosklo: riprenditi con il BDFL, per favore, non io. Poiché Python restituisce True, questo deve essere il modo in cui Python.
S.Lott

2
Intendo per coerenza con gli altri operatori logici di Python - Python non restituisce True quando lo faccio ('this' o ''), restituisce 'this'. Ma nella tua funzione xor ('this', '') restituisce True. Dovrebbe restituire 'this' come fa il builtin "o" di Python.
nosklo,

10
Python ande orfare corto circuito. Qualsiasi xorimplementazione non può cortocircuitare, quindi c'è già una discrepanza; pertanto, non vi è alcun motivo che xordovrebbe funzionare comeand + ordo.
martedì

7

A volte mi ritrovo a lavorare con 1 e 0 invece di valori booleani True e False. In questo caso xor può essere definito come

z = (x + y) % 2

che ha la seguente tabella di verità:

     x
   |0|1|
  -+-+-+
  0|0|1|
y -+-+-+
  1|1|0|
  -+-+-+

7

So che è tardi, ma ho pensato e potrebbe valere la pena, solo per la documentazione. Forse questo funzionerebbe: np.abs(x-y)l'idea è quella

  1. se x = True = 1 e y = False = 0 il risultato sarebbe | 1-0 | = 1 = True
  2. se x = False = 0 e y = False = 0 il risultato sarebbe | 0-0 | = 0 = Falso
  3. se x = True = 1 e y = True = 1 il risultato sarebbe | 1-1 | = 0 = Falso
  4. se x = False = 0 e y = True = 1 il risultato sarebbe | 0-1 | = 1 = True

7

Semplice, facile da capire:

sum( (bool(a), bool(b) ) == 1

Se una scelta esclusiva è ciò che stai cercando, può essere estesa a più argomenti:

sum( bool(x) for x in y ) % 2 == 1

1
sum(map(bool, y)) % 2 == 1
Warvariuc,

6

Cosa ne pensi di questo?

(not b and a) or (not a and b)

darà ase bè falso
darà bse aè falso
darà Falsealtrimenti

O con l'espressione ternaria Python 2.5+:

(False if a else b) if b else a

6

Alcune delle implementazioni suggerite qui causeranno una valutazione ripetuta degli operandi in alcuni casi, il che può portare a effetti collaterali indesiderati e pertanto deve essere evitato.

Detto questo, xorun'implementazione che ritorna Trueo Falseè abbastanza semplice; uno che restituisce uno degli operandi, se possibile, è molto più complicato, perché non esiste alcun consenso su quale operando dovrebbe essere quello scelto, specialmente quando ci sono più di due operandi. Per esempio, dovrebbe xor(None, -1, [], True)tornare None, []oFalse ? Scommetto che ogni risposta appare ad alcune persone come la più intuitiva.

Per il risultato Vero o Falso, ci sono fino a cinque possibili scelte: restituisce il primo operando (se corrisponde al risultato finale in valore, altrimenti booleano), restituisce la prima corrispondenza (se ne esiste almeno una, altrimenti booleana), restituisce l'ultimo operando (if ... else ...), restituisce l'ultima corrispondenza (if ... else ...) o restituisce sempre booleano. Complessivamente, questo è 5 ** 2 = 25 gusti di xor.

def xor(*operands, falsechoice = -2, truechoice = -2):
  """A single-evaluation, multi-operand, full-choice xor implementation
  falsechoice, truechoice: 0 = always bool, +/-1 = first/last operand, +/-2 = first/last match"""
  if not operands:
    raise TypeError('at least one operand expected')
  choices = [falsechoice, truechoice]
  matches = {}
  result = False
  first = True
  value = choice = None
  # avoid using index or slice since operands may be an infinite iterator
  for operand in operands:
    # evaluate each operand once only so as to avoid unintended side effects
    value = bool(operand)
    # the actual xor operation
    result ^= value
    # choice for the current operand, which may or may not match end result
    choice = choices[value]
    # if choice is last match;
    # or last operand and the current operand, in case it is last, matches result;
    # or first operand and the current operand is indeed first;
    # or first match and there hasn't been a match so far
    if choice < -1 or (choice == -1 and value == result) or (choice == 1 and first) or (choice > 1 and value not in matches):
      # store the current operand
      matches[value] = operand
    # next operand will no longer be first
    first = False
  # if choice for result is last operand, but they mismatch
  if (choices[result] == -1) and (result != value):
    return result
  else:
    # return the stored matching operand, if existing, else result as bool
    return matches.get(result, result)

testcases = [
  (-1, None, True, {None: None}, [], 'a'),
  (None, -1, {None: None}, 'a', []),
  (None, -1, True, {None: None}, 'a', []),
  (-1, None, {None: None}, [], 'a')]
choices = {-2: 'last match', -1: 'last operand', 0: 'always bool', 1: 'first operand', 2: 'first match'}
for c in testcases:
  print(c)
  for f in sorted(choices.keys()):
    for t in sorted(choices.keys()):
      x = xor(*c, falsechoice = f, truechoice = t)
      print('f: %d (%s)\tt: %d (%s)\tx: %s' % (f, choices[f], t, choices[t], x))
  print()

5

Molte persone, incluso me stesso, hanno bisogno di una xorfunzione che si comporti come un circuito x-input n, in cui n è variabile. (Vedi https://en.wikipedia.org/wiki/XOR_gate ). La seguente semplice funzione implementa questo.

def xor(*args):
   """
   This function accepts an arbitrary number of input arguments, returning True
   if and only if bool() evaluates to True for an odd number of the input arguments.
   """

   return bool(sum(map(bool,args)) % 2)

Segue I / O di esempio:

In [1]: xor(False, True)
Out[1]: True

In [2]: xor(True, True)
Out[2]: False

In [3]: xor(True, True, True)
Out[3]: True

5

Per ottenere lo xor logico di due o più variabili in Python:

  1. Converti input in valori booleani
  2. Utilizzare l'operatore xor bit a bit ( ^o operator.xor)

Per esempio,

bool(a) ^ bool(b)

Quando si convertono gli input in booleani, xor bit a bit diventa xor logico .

Nota che la risposta accettata è sbagliata: != non è la stessa di xor in Python a causa della sottigliezza del concatenamento dell'operatore .

Ad esempio, lo xor dei tre valori seguenti è errato quando si utilizza !=:

True ^  False ^  False  # True, as expected of XOR
True != False != False  # False! Equivalent to `(True != False) and (False != False)`

(PS Ho provato a modificare la risposta accettata per includere questo avviso, ma la mia modifica è stata respinta.)


4

È facile quando sai cosa fa XOR:

def logical_xor(a, b):
    return (a and not b) or (not a and b)

test_data = [
  [False, False],
  [False, True],
  [True, False],
  [True, True],
]

for a, b in test_data:
    print '%r xor %s = %r' % (a, b, logical_xor(a, b))

4

Ciò ottiene l'XOR logico esclusivo per due (o più) variabili

str1 = raw_input("Enter string one:")
str2 = raw_input("Enter string two:")

any([str1, str2]) and not all([str1, str2])

Il primo problema con questa configurazione è che molto probabilmente attraversa l'intero elenco due volte e, come minimo, controllerà almeno uno degli elementi due volte. Quindi può aumentare la comprensione del codice, ma non si presta alla velocità (che può differire in modo trascurabile a seconda del caso d'uso).

Il secondo problema con questa configurazione è che controlla l'esclusività indipendentemente dal numero di variabili. Questo può essere inizialmente considerato una caratteristica, ma il primo problema diventa molto più significativo con l'aumentare del numero di variabili (se mai lo fanno).


4

Xor è ^in Python. Restituisce:

  • Un xor bit a bit per ints
  • Logico xor per bool
  • Un'unione esclusiva per i set
  • Risultati definiti dall'utente per le classi che implementano __xor__ .
  • TypeError per tipi non definiti, come stringhe o dizionari.

Se hai intenzione di usarli sulle stringhe comunque, inserirle boolrende l'operazione inequivocabile (potresti anche voler dire set(str1) ^ set(str2)).



3

Ecco come codificarei qualsiasi tabella di verità. Per xor in particolare abbiamo:

| a | b  | xor   |             |
|---|----|-------|-------------|
| T | T  | F     |             |
| T | F  | T     | a and not b |
| F | T  | T     | not a and b |
| F | F  | F     |             |

Basta guardare i valori T nella colonna delle risposte e mettere insieme tutti i casi veri con logico o. Quindi, questa tabella di verità può essere prodotta nel caso 2 o 3. Quindi,

xor = lambda a, b: (a and not b) or (not a and b)

-6

Possiamo facilmente trovare xor di due variabili usando:

def xor(a,b):
    return a !=b

Esempio:

xor (Vero, Falso) >>> Vero


1
o xor("hey", "there")>>> Vero, ma non è quello che vogliamo
Mayou36,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.