Compréhension de listes

Compréhension de listes#

Les compréhensions sont un moyen confortable de construire des listes (ou autres collections) en décrivant tous les éléments, avec une syntaxe proche de la notation mathématiques pour l’ensemble des \(f(x)\) pour \(x\) dans \(X\) tels que \(c(x)\).

\[ \{ f(x) \mid x\in X, c(x) \}\]

En Python la syntaxe est:

      [ <expr> for <name> in <iterable> ]
      [ <expr> for <name> in <iterable> if <condition> ]

Où :

  • expression est l’opération ou la fonction à appliquer à chaque élément de l’itérable.

  • name est une variable temporaire qui représente chaque élément de l’itérable.

  • iterable est la liste ou l’objet itérable dont on souhaite traiter les éléments.

  • condition est une condition optionnelle pour filtrer les éléments de l’itérable.

Supposons que nous ayons une liste de nombres et que nous voulions créer une nouvelle liste contenant les carrés de ces nombres. Voici comment nous pourrions utiliser une compréhension de liste pour accomplir cela :

nombres = [1, 2, 3, 4, 5]
carres = [x**2 for x in nombres]
print(carres)  # Résultat : [1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]

Dans cet exemple, x**2 est l’expression qui calcule le carré de chaque élément, et x est la variable temporaire qui représente chaque élément de la liste nombres.

Il est possible d’ajouter une condition pour filtrer les éléments de la liste d’entrée. Par exemple, si nous voulons obtenir les carrés des nombres pairs uniquement, nous pouvons ajouter une condition if comme suit :

nombres = [1, 2, 3, 4, 5]
carres_pairs = [x**2 for x in nombres if x % 2 == 0]
print(carres_pairs)  # Résultat : [4, 16]
[4, 16]

Dans cet exemple, la condition x % 2 == 0 vérifie si un nombre est pair.

Source

Voici un autre exemple : la liste des \(i^2\)\(i\) est dans \(\{1, 3, 7\}\):

[ i**2 for i in [1, 3, 7] ]
[1, 9, 49]

La même où \(i\) parcoure l’intervale \([0, 10[\):

[ i**2 for i in range(0, 10) ]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

La liste des \(i^2\) dans l’intervale \([0,10[\) tels que \(i\) n’est pas divisible par trois:

[ i**2 for i in range(0, 10) if i % 3 != 0]
[1, 4, 16, 25, 49, 64]

Exercice

  1. À partir de la liste a ci-dessous, construisez une nouvelle liste b ne contenant que les valeurs de a supérieures à 5, en utilisant une boucle for et la méthode append:

a = [1, 4, 2, 7, 1, 9, 0, 3, 4, 6, 6, 6, 8, 3]
b = []
### BEGIN SOLUTION
for x in a:
    if x > 5:
        b.append(x)
### END SOLUTION
  1. Construisez à nouveau b en utilisant maintenant une compréhension.

### BEGIN SOLUTION
b = [x for x in a if x > 5]
### END SOLUTION

À faire

Conclusion/rappel sur la concision de la notation, sa proximité avec la notation mathématique des ensembles, le fait qu’avec une compréhension on décrit ce que l’on veut obtenir plutôt que comment on veut l’obtenir.