Est-il possible de "factoriser" une condition

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, Je me pose la question suivante :
Est-il possible de "factoriser" le test de variable dans une condition ?
pour illustrer mes propos

Exemple à facto : if (var == 'a' OR var == 'b' OR var == 'c'):

Et d'obtenir quelque chose de similaire à cette syntaxe : if (var == 'a' OR 'b' OR 'c'):

Sans bien sur utiliser de for et de liste comprenant les valeurs

Rien ne se tranforme, rien ne se crée, tout se perd. LaVOIDier

+0 -0

Note : Cela fonctionne sur tout type que tu peux itérer. Donc tu peux tout aussi bien écrire cela if var in 'abc': pour faire plus court.

Note2 : lorsque tu as des conditions simples comme celles-ci mais dans lesquelles tu veux plus d'éléments possibles (par exemple 'abc…z' et en ignorant str.isalpha()), tu peux faire une formulation comme suit : if var >= 'a' and var <= 'z', voire même (plus pythonic) : if 'a' <= var <= 'z'.

Édité par Bermudes

Le hasard n'est que le nom donné à notre ignorance et n'existerait pas pour un être ominscient., Émile Borel

+1 -0
Staff

Note : Cela fonctionne sur tout type que tu peux itérer. Donc tu peux tout aussi bien écrire cela if var in 'abc': pour faire plus court.

Attention :

1
2
>>> "ab" in "abc"
True

I was a llama before it was cool

+1 -0
Staff

Je me permets de le faire remarquer parce que je me suis déjà fait avoir bêtement, à transformer un tuple de chaînes en une chaîne simple de ce style.

Autre remarque, quand tu as vraiment beaucoup de conditions sur des chaînes ça peut aussi valloir le coup d'envisager utiliser un dictionnaire.

I was a llama before it was cool

+2 -0

Je me permets de le faire remarquer parce que je me suis déjà fait avoir bêtement, à transformer un tuple de chaînes en une chaîne simple de ce style.

nohar

Il y a peu j'ai perdu mon temps sur un truc dans ce genre :

1
2
>>> '' in 'abc'
True

Et je ne comprends toujours pas pourquoi. [troll] Probablement encore des considérations absurdes de zéro et d'infini… :-° [/troll]

Édité par psycopy

+0 -0
Staff

Pour le coup je trouve ça logique : in représente l'inclusion au sens ensembliste sur les chaînes de caractères. L'ensemble vide est inclus dans tous les ensembles, c'est sa définition.

Ce que je ne trouve pas logique par contre, c'est que ['c', 'd'] not in ['a', 'b', 'c', 'd'].

En y réfléchissant, ça s'explique par le fait que in représente non pas l'inclusion sur les collections, mais l'appartenance. C'est un peu déroutant, mais c'est le choix pratique : 99 % du temps on s'en fout de l'inclusion, et une liste peut être un élément d'une autre. Sauf qu'une chaîne n'est pas une collection en Python mais un objet scalaire (la notion de caractère n'existe pas), donc ça explique le sens différent de l'opérateur, d'autant que dans ce cas, faire de in un opérateur d'inclusion répond à tous les besoins, à quelques corner cases près.

Édité par nohar

I was a llama before it was cool

+1 -0

Je saisi mieux la raison en comparant ce comportement avec celui des listes. Merci, me reste plus qu'à lire quelques documents sur la théorie des ensembles et ça finira peut-être par me sembler naturel… C'est pas gagné. :D

Édité par psycopy

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte