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 :
maliste = []
for i in range(1, 101):
maliste.append(i**2)
Voici une autre façon de faire, plus courte :
maliste = [i**2 for i in range(1, 101)]
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 :
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 :
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
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 :
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 variablevaleurs_x
;[5*x**2+1 for x in valeurs_x]
va créer la liste des valeurs des \(5 x^2 + 1\) pourx
qui prend chaque valeur de la séquencevaleurs_x
(doncx
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 :
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 :
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 variableprenom
en majuscules ;for prenom in liste_prenoms
: la variableprenom
prendra chaque valeur de la listeliste_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]
oùliste_valeurs
peut être unrange(...)
. - 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.