Il s’agit plus de python syntaxe de compréhension de liste. 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 crée un filtre - j'ai une liste de sources, 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 liste de compréhension?
x if y else z
est la syntaxe de l'expression que vous renvoyez pour chaque élément. Ainsi vous avez besoin de:
[ x if x%2 else x*100 for x in range(1, 10) ]
La confusion provient du fait que vous utilisez un filtre dans le premier exemple, mais pas dans le second. Dans le deuxième exemple, vous ne faites que mappage chaque valeur à une autre, en utilisant une expression d'opérateur ternaire.
Avec un filtre, vous avez besoin de:
[ EXP for x in seq if COND ]
Sans filtre, vous avez besoin de:
[ EXP for x in seq ]
et dans votre deuxième exemple, l'expression est "complexe", ce qui implique un if-else
.
[x if x % 2 else x * 100 for x in range(1, 10) ]
Juste une autre solution, espérons que cela plaira à quelqu'un:
Utilisation de: [False, True] [Expression]
>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
Vous pouvez aussi le faire avec une compréhension de liste:
A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A
J'ai pu faire ça
>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>