web-dev-qa-db-fra.com

Condition 'ou' multiple dans Python

J'ai un petit problème de code et cela fonctionne avec IDLE et non avec Eclipse, puis-je écrire ceci:

if  fields[9] != ('A' or 'D' or 'E' or 'N' or 'R'):

au lieu de cela :

if  fields[9] != 'A' and fields[9] != 'D' and fields[9] != 'E' and fields[9] != 'N' and fields[9] != 'R':

Merci.

17
katze

Utilisation not in et une séquence:

if fields[9] not in ('A', 'D', 'E', 'N', 'R'):

qui teste par rapport à un Tuple, qui Python stockera commodément et efficacement comme une constante. Vous pouvez également utiliser un set literal:

if fields[9] not in {'A', 'D', 'E', 'N', 'R'}:

mais seules les versions plus récentes de Python ( Python 3.2 et plus récent) reconnaîtront cela comme une constante immuable. C'est l'option la plus rapide pour le code plus récent.

Comme il s'agit d'un seul caractère, vous pouvez même utiliser une chaîne:

if fields[9] not in 'ADENR':
32
Martijn Pieters

Vous voulez que l'opérateur in:

if fields[9] not in 'ADENR':
    ...

Ou, vous pouvez utiliser any:

if not any(fields[9] == c for c in 'ADENR'):
    ...

Ou, alternativement, all, qui peut avoir un peu plus la même forme que l'original:

if all(fields[9] != c for c in 'ADENR'):
    ...

En aparté:

if x != ('A' or 'B' or 'C'):

c'est vraiment la même chose que de dire:

if x != 'A':

car 'A' or 'B' or 'C' correspond à 'A' (Essayez-le!). La raison en est qu'avec or, python renverra la première valeur "non-falsey" (ou la dernière si elles sont toutes falsey). Puisque les chaînes non vides sont non-falsey, le premier est retourné.

10
mgilson