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
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.
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:
someList
une fois. Au lieu d'effectuer 1 000 tests, dans le scénario ci-dessus, il effectue uniquement 100 tests.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.or
n'est pas exclusif (par exemple xor
), donc or
est identique à and/or
.
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)
Cherchez-vous...
a if b else c
Ou peut-être avez-vous mal compris la or
de Python? True or True
est True
.
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.