web-dev-qa-db-fra.com

Compréhension des listes sur une ligne: variantes if-else

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?

142
ducin

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.

279
shx2
[x if x % 2 else x * 100 for x in range(1, 10) ]
21
lucasg

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]
>>>
10
James Sapam

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
10
Stefan Gruenwald

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]
>>>
2
anudeep