web-dev-qa-db-fra.com

ET / OU en Python?

Je sais que les expressions and et or existent en python, mais existe-t-il une expression and/or? Ou un moyen de les combiner afin de produire le même effet qu'une expression and/or?

mon code ressemble à ceci:

if input=="a":        
    if "a" or "á" or "à" or "ã" or "â" in someList:            
        someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.remove("ã") or someList.remove("â")

avec cela, je veux dire que si l'utilisateur entre "a" et que n'importe quel type de "a" est inclus dans une liste définie précédemment, puis-je avoir tous les types de "a" supprimés de la liste?

python me dit qu'il y a un problème dans:

someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.remove("ã") or someList.remove("â")

il me dit: ValueError: list.remove(x): x not in list

38
JNat

Comme l'explique la réponse de Matt Ball , or est "et/ou". Mais or ne fonctionne pas avec in comme vous l’utilisez plus haut. Vous devez dire if "a" in someList or "á" in someList or.... Ou mieux encore,

if any(c in someList for c in ("a", "á", "à", "ã", "â")):
    ...

C'est la réponse à votre question telle que posée.

Autres notes

Cependant, il y a encore quelques choses à dire sur l'exemple de code que vous avez posté. Tout d'abord, la chaîne d'instructions someList.remove... or someList remove... n'est pas nécessaire et peut entraîner un comportement inattendu. C'est aussi difficile à lire! Mieux vaut le diviser en lignes individuelles:

someList.remove("a")
someList.remove("á")
...

Même cela ne suffit pas, cependant. Comme vous l'avez constaté, si l'élément ne figure pas dans la liste, une erreur est générée. De plus, utiliser remove est très lent, car chaque fois que vous l'appelez, Python doit examiner chaque élément de la liste. Donc, si vous souhaitez supprimer 10 caractères différents et que vous avez une liste de 100 caractères, vous devez effectuer 1 000 tests.

Au lieu de cela, je suggérerais une approche très différente. Filtrez la liste en utilisant un set, comme ceci:

chars_to_remove = set(("a", "á", "à", "ã", "â"))
someList = [c for c in someList if c not in chars_to_remove]

Ou modifiez la liste sur place sans créer de copie:

someList[:] = (c for c in someList if c not in chars_to_remove)

Ces deux méthodes utilisent la syntaxe de compréhension de liste pour créer une nouvelle liste. Ils examinent chaque caractère de someList, vérifient que le caractère se trouve dans chars_to_remove, et si ce n'est pas le cas, ils l'incluent dans la nouvelle liste.

C'est la version la plus efficace de ce code. Il a deux avantages de vitesse:

  1. Il ne traverse que someList une fois. Au lieu d'effectuer 1 000 tests, dans le scénario ci-dessus, il effectue uniquement 100 tests.
  2. Il peut tester tous les caractères en une seule opération, car chars_to_remove est un set. Si chars_to_remove était une list ou Tuple, chaque test correspondrait en réalité à 10 tests dans le scénario ci-dessus, car chaque caractère de la liste devrait être vérifié individuellement.
38
senderle

or n'est pas exclusif (par exemple xor ), donc or est identique à and/or.

15
Matt Ball

x and y renvoie true si x et y sont tous deux true.
x or y renvoie si l'un ou l'autre est true.

Nous pouvons en conclure que or contient and en lui-même, à moins que vous ne vouliez dire xOR (ou sauf si and est vrai)

14
user1241335

Cherchez-vous...

a if b else c

Ou peut-être avez-vous mal compris la or de Python? True or True est True.

5
Amber

Pour la question mise à jour, vous pouvez remplacer ce que vous voulez par quelque chose comme:

someList = filter(lambda x: x not in ("a", "á", "à", "ã", "â"), someList)

filter évalue chaque élément de la liste en le transmettant au lambda fourni. Dans cette lambda, nous vérifions si l’élément n’est pas l’un des caractères fournis, car ils doivent rester dans la liste.

Sinon, si les éléments de someList doivent être uniques, vous pouvez en faire someList un ensemble et procéder comme suit:

someList = list(set(someList)-set(("a", "á", "à", "ã", "â")))

Cela prend essentiellement la différence entre les ensembles, ce qui fait ce que vous voulez, mais garantit également que chaque élément n'apparaît qu'une seule fois, ce qui est différent d'une liste. Notez que vous pouvez stocker someList comme un ensemble depuis le début. Dans ce cas, cela optimisera un peu les choses.

4
KillianDS