Aller au contenu

Les listes en compréhension

Création d'une liste par "compréhension"⚓︎

Principe général⚓︎

Supposons que je veuille créer la liste des carrés des entiers de 1 à 100, je peux taper :

🐍 Script Python
maliste = []
for i in range(1, 101):
    maliste.append(i**2)

Voici une autre façon de faire, plus courte :

🐍 Script Python
maliste = [i**2 for i in range(1, 101)]
que je lis ainsi : maliste est constituée des carrés de i, pour i allant de 1 à 100.

Je peux également ajouter des conditions, par exemple, si je veux avoir seulement les carrés inférieurs à 50 :

🐍 Script Python
maliste = [i**2 for i in range(1, 101) if i**2 < 50]

Remarques

  • Les listes par compréhension n'existent pas dans tous les langages et sont donc à utiliser avec parcimonie...
  • Ceci se rapproche des définitions d'ensemble en mathématiques, ici pour le premier exemple : \(\{x^2, x\in \mathbb{N}, 1 \leq x \leq 100 \}\).

Exemples⚓︎

Voyons quelques exemples d'utilisations. Je vous invite à les tester dans la console ci-dessous.

Exemple 1

Pour obtenir les parties entières d'une série de valeurs décimales contenues dans maliste = [3.14, 2.718, 1.414], je peux faire ceci :

🐍 Script Python
maliste = [3.14, 2.718, 1.414]
nouvelle_liste = []
for valeur in maliste: # pour chaque valeur de ma liste
    nouvelle_liste.append(int(valeur)) # ajouter à la nouvelle liste la partie entière de la valeur
nouvelle_liste # pour vérifier le résultat
ou cela :
🐍 Script Python
maliste = [3.14, 2.718, 1.414]
nouvelle_liste = [int(valeur) for valeur in maliste] 
# nouvelle_liste est constituée des parties entières des valeurs de maliste
nouvelle_liste

Exemple 2

Pour faire un tableau de valeurs de la fonction f définie sur [-2 ; 3] par \(f(x) = 5 x^2 + 1\), je peux écrire ceci :

🐍 Script Python
valeurs_x = range(-2, 4)
valeurs_y = [5*x**2+1 for x in valeurs_x]
valeurs_y

Quelques explications :
  • range(-2, 4) sert à générer une séquence d'entiers de -2 à 3, celle-ci est stockée dans une variable valeurs_x ;
  • [5*x**2+1 for x in valeurs_x] va créer la liste des valeurs des \(5 x^2 + 1\) pour x qui prend chaque valeur de la séquence valeurs_x (donc x sera égal à 0, puis 1, puis 2, puis 3) ;
  • la dernière ligne va renvoyer la liste valeurs_y.

Exemple 3

Pour obtenir tous les carrés inférieurs à 200 des nombres impairs, je peux écrire :

🐍 Script Python
liste_carres = [x**2 for x in range(1, 100) if x % 2 == 1]

Quelques explications :
  • je prends tous les x de 1 à 99, sachant que 992 > 200, cela suffira largement ;
  • parmi les résultats, je ne garde que ceux pour lesquels x % 2 == 1 (c'est une condition qui définit les nombres impairs).

Exemple 4

Pour ne garder que des prénoms de moins de 5 lettres et les mettre en majuscules :

🐍 Script Python
liste_prenoms = ["Jacqueline", "Yvette", "Pierre", "Paul", "Jacques", "Hubert", "Eva", "Jim"]
liste_prenoms_courts = [prenom.upper() for prenom in liste_prenoms if len(prenom)<5]

Quelques explications :
  • prenom.upper() : nous voulons le contenu d'une variable prenom en majuscules ;
  • for prenom in liste_prenoms : la variable prenom prendra chaque valeur de la liste liste_prenoms ;
  • len(prenom)<5 : mais nous ne conservons que les prénoms courts.

À retenir

Création d'une liste par compréhension :

  • pour créer une liste à partir d'une formule :
    [formule for variable in liste_valeurs]
    liste_valeurs peut être un range(...).
  • pour ne garder qu'une partie des valeurs, ajouter une condition avec if :
    [formule for i in liste_valeurs if condition]

Exercices : création d'une liste par compréhension

Refaîtes plusieurs fois chacun des exercices suivants jusqu'à ce que vous soyez sûrs d'avoir compris.

Exercice

Essayez de trouver les commandes permettant de générer les listes suivantes, en utilisant l'écriture par compréhension (utilisez la console Python pour vérifier) :

[6, 9, 12, 15, 18, 21]

["blabla", "papa", "titi", "cricri"] en utilisant la liste maliste = ["bla", "pa", "ti", "cri"]

Aide

En Python, "to" * 2 donne "toto".

J'ai une liste de valeurs : [7, 17, 9, 5, 8, 18, 15] et je veux une liste de ces valeurs augmentées de 5.

Même question que la 3 mais en ne conservant que les résultats inférieurs ou égaux à 20.

Même question mais en n'augmentant que les valeurs initialement inférieures à 10.

Plus d'informations

Hors-programme de la spécialité mathématiques⚓︎

Il reste encore des choses à dire sur les listes en Python mais elles ne sont pas au programme de la spécialité mathématiques (mais au programme de la spécialité NSI). Je pense en particulier :

  • au slicing, qui permet de récupérer plusieurs éléments d'une liste ;
  • à la copie d'une liste, qui réserve quelques surprises...
  • aux listes de listes, indispensables pour créer des tableaux à double entrée par exemple.