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

Principe général

Les listes par compréhension sont une pure pythonnerie, que vous ne retrouverez pas dans d'autres langages (à ma connaissance...).

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)

alors maliste contiendra bien ce qu'il faut.

Voici une autre façon de faire, plus "ramassée" :

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 :

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

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

ou cela :

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 x2 + 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 :

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 :

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 :

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.

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) :
  1. [6, 9, 12, 15, 18, 21]
  2. ["blabla", "papa", "titi", "cricri"] (*) en utilisant la liste maliste = ["bla", "pa", "ti", "cri"]
  3. 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
  4. même question mais en ne conservant que les résultats inférieurs ou égaux à 20
  5. même question mais en n'augmentant que les valeurs initialement inférieures à 10.
(*) aide : en Python, "to" * 2 donne "toto"

Une vidéo sur les listes par compréhension.

Plus d'informations sur les listes par compréhension.

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 :