Il s'agit davantage de la syntaxe de compréhension de liste python. J'ai une compréhension de liste qui produit une liste de nombres impairs d'une plage donnée:
[x for x in range(1, 10) if x % 2]
Cela fait un filtre - j'ai une liste source, où je supprime les nombres pairs ( if x % 2
). J'aimerais utiliser quelque chose comme si-alors-autre ici. Le code suivant échoue:
>>> [x for x in range(1, 10) if x % 2 else x * 100]
File "<stdin>", line 1
[x for x in range(1, 10) if x % 2 else x * 100]
^
SyntaxError: invalid syntax
Il existe une expression python comme if-else:
1 if 0 is 0 else 3
Comment l'utiliser dans une compréhension de liste?
()
place de[]
.if x % 2
élimine les nombres pairs (au lieu de les garder) - c'est parce que quandx
même l'x % 2
expression aboutit0
, qui, à son tour, évalue àFalse
, tandis que toutint
sauf0
évalue àTrue
.Réponses:
x if y else z
est la syntaxe de l'expression que vous renvoyez pour chaque élément. Il vous faut donc:La confusion vient du fait que vous utilisez un filtre dans le premier exemple, mais pas dans le second. Dans le deuxième exemple, vous ne mappez chaque valeur que sur une autre, en utilisant une expression d'opérateur ternaire.
Avec un filtre, vous avez besoin de:
Sans filtre, vous avez besoin de:
et dans votre deuxième exemple, l'expression est "complexe", qui se trouve à impliquer un
if-else
.la source
[x for x in range(1, 10) if x % 2]
est la syntaxe correcte.[x if x % 2 for x in range(1, 10)]
- ce n'est pas, mais[x if x%2 else x*100 for x in range(1, 10)]
c'est encore une syntaxe correcte. Comment venir?else
), ni un filtre (puisqu'il s'agit de laEXP
partie de la compréhension de la liste)if
à la fin:[x if x%2 else x*100 for x in range(1, 10) if not x%3]
le premierif
fait partie de l'opérateur ternaire, le secondif
fait partie de la syntaxe de compréhension de liste. Le toutx if x%2 else x*100
est "au même niveau" qu'un simple2*x
, c'est l'expression à évaluer sur le côté gauche dufor
, lorsque le filtrage deif not x%3
a déjà eu lieu.for i in x:
puis dans la boucle forif i == y:
?la source
Vous pouvez également faire cela avec la compréhension de liste:
la source
Juste une autre solution, j'espère que quelqu'un pourra l'aimer:
Utilisation de: [False, True] [Expression]
la source
J'ai pu faire ça
la source