944 votes

Comment obtenez-vous le xor logique de deux variables en Python ?

Comment obtenez-vous le xor logique de deux variables en Python ?

Par exemple, j’ai deux variables que je m’attends à être des chaînes. Je veux tester que seulement l’un d’eux contient une valeur True (n’est pas zéro ou une chaîne vide) :

Le `` opérateur semble être au niveau du bit et mal défini sur tous les objets :

1628voto

Coady Points 11374

Si vous êtes déjà normalisant les entrées à valeurs booléennes, puis ! = est xor.

664voto

Zach Hirsch Points 5040

Vous pouvez toujours utiliser la définition de xor pour le calculer à partir d'autres opérations logiques:

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

Mais c'est un peu trop verbeux pour moi, et n'est pas particulièrement clair au premier coup d'œil. Une autre façon de le faire est:

bool(a) ^ bool(b)

L'opérateur xor sur deux booléens est logique xor (contrairement à l'ints, où c'est au niveau du bit). Ce qui est logique, puisqu' bool est juste une sous-classe de int, mais est mis en œuvre uniquement les valeurs 0 et 1. Et logique xor est équivalent à xor au niveau du bit lorsque le domaine est restreint à l' 0 et 1.

Si l' logical_xor fonction serait mis en œuvre comme:

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

Crédit à Nick Coghlan sur le Python-3000 liste de diffusion.

239voto

singingwolfboy Points 1358

Exclusif- ou est déjà incorporé à Python, dans la `` module :

55voto

ddaa Points 19102

Comme Zach expliqué, vous pouvez utiliser:

xor = bool(a) ^ bool(b)

Personnellement, je préfère un peu différente dialecte:

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

Ce dialecte est inspiré d'une logique de création de diagrammes langue que j'ai appris à l'école où "OU" a été marqué par une boîte contenant ≥1 (supérieur ou égal à 1) et "XOR" a été marqué par une boîte contenant =1.

Ceci a l'avantage de mettre correctement en œuvre exclusive ou sur plusieurs opérandes.

  • "1 = a ^ b ^ c..." signifie le nombre de vrais opérandes est impair. Cet opérateur est "parité".
  • "1 = a + b + c..." signifie exactement l'un des opérandes est vrai. C'est le "ou exclusif", qui signifie "l'un à l'exclusion des autres".

34voto

nosklo Points 75862
  • Python logique or: A or B: les retours A si bool(A) est True, sinon renvoie B
  • Python logique and: A and B: les retours A si bool(A) est False, sinon renvoie B

Pour garder le plus de cette façon de penser, ma logique xor définition serait:

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

De cette façon, il peut renvoyer a, bou False:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X