Python Language Liste conditionnelle


Exemple

Étant donné une compréhension de la liste, vous pouvez ajouter une ou plusieurs conditions if pour filtrer les valeurs.

[<expression> for <element> in <iterable> if <condition>]

Pour chaque <element> dans <iterable> ; Si <condition> True , ajoutez <expression> (généralement une fonction de <element> ) à la liste renvoyée.


Par exemple, cela peut être utilisé pour extraire uniquement des nombres pairs d'une suite d'entiers:

[x for x in range(10) if x % 2 == 0]
# Out: [0, 2, 4, 6, 8]

Démo en direct

Le code ci-dessus est équivalent à:

even_numbers = [] 
for x in range(10):
    if x % 2 == 0:
        even_numbers.append(x)

print(even_numbers)
# Out: [0, 2, 4, 6, 8]

En outre, une compréhension conditionnelle de la forme [e for x in y if c] (où e et c sont des expressions en termes de x ) est équivalente à list(filter(lambda x: c, map(lambda x: e, y))) .

Malgré le même résultat, faites attention au fait que le premier exemple est presque deux fois plus rapide que le second. Pour ceux qui sont curieux, c'est une bonne explication de la raison pour laquelle.


Notez que ceci est très différent de l'expression conditionnelle ... if ... else ... (parfois appelée expression ternaire ) que vous pouvez utiliser pour la partie <expression> de la compréhension de liste. Prenons l'exemple suivant:

[x if x % 2 == 0 else None for x in range(10)]
# Out: [0, None, 2, None, 4, None, 6, None, 8, None]

Démo en direct

Ici, l'expression conditionnelle n'est pas un filtre, mais plutôt un opérateur déterminant la valeur à utiliser pour les éléments de la liste:

<value-if-condition-is-true> if <condition> else <value-if-condition-is-false>

Cela devient plus évident si vous le combinez avec d’autres opérateurs:

[2 * (x if x % 2 == 0 else -1) + 1 for x in range(10)]
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

Démo en direct

Si vous utilisez Python 2.7, xrange peut être préférable à range pour plusieurs raisons, comme décrit dans la documentation de xrange .

[2 * (x if x % 2 == 0 else -1) + 1 for x in xrange(10)]
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

Le code ci-dessus est équivalent à:

numbers = []
for x in range(10):
    if x % 2 == 0:
        temp = x
    else:
        temp = -1
    numbers.append(2 * temp + 1)
print(numbers)
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

On peut combiner des expressions ternaires et if conditions. L'opérateur ternaire travaille sur le résultat filtré:

[x if x > 2 else '*' for x in range(10) if x % 2 == 0]
# Out: ['*', '*', 4, 6, 8]

La même chose n'aurait pas pu être réalisée uniquement par l'opérateur ternaire:

[x if (x > 2 and x % 2 == 0) else '*' for x in range(10)]
# Out:['*', '*', '*', '*', 4, '*', 6, '*', 8, '*']

Voir aussi: Filtres , qui offrent souvent une alternative suffisante aux compréhensions de listes conditionnelles.