Création et manipulation de listes

1èreMathematiquesNotion de liste et algorithmesCréation et manipulation de listes~8 min de lecture

Création et manipulation de listes

Une liste, c'est une rangée de casiers numérotés à partir de 0 : on la remplit, on lit ou on change un casier grâce à son numéro, et on la parcourt avec une boucle pour calculer une somme, une moyenne ou un maximum.

Objectifs

  • Créer une liste en Python : en extension, par ajouts successifs avec append, en compréhension.
  • Accéder à un élément par son indice, modifier un élément, connaître la longueur d'une liste avec len.
  • Parcourir une liste avec une boucle for (par les éléments ou par les indices).
  • Écrire des algorithmes simples sur une liste : somme, moyenne, maximum, comptage, termes d'une suite.

1. Qu'est-ce qu'une liste ?

Notions clés

Une liste est une suite ordonnée d'éléments, écrite entre crochets et séparés par des virgules. Chaque élément a une position appelée indice. Le premier indice est 0, pas 1.

prix = [250, 500, 150, 1000]   # prix en F CFA de 4 produits au marché

Si une liste \(L\) contient \(n\) éléments, ses indices vont de \(0\) à \(n-1\). La longueur \(n\) s'obtient avec len(L). On peut aussi compter à partir de la fin avec des indices négatifs : L[-1] est le dernier élément.

La liste prix représentée comme quatre casiers avec leurs indices positifs en dessous et leurs indices négatifs plus bas prix = 250 500 150 1000 0 1 2 3 indice -4 -3 -2 -1 négatif len(prix) = 4, indices de 0 à 3

Accéder à un élément, le modifier

prix = [250, 500, 150, 1000]
print(prix[0])    # affiche 250
print(prix[-1])   # affiche 1000
prix[1] = 450     # le casier 1 contient maintenant 450
print(prix)       # [250, 450, 150, 1000]
print(len(prix))  # 4

Avec prix = [250, 500, 150, 1000], que vaut prix[2] ?

  1. 500
  2. 150
  3. 1000
Les indices commencent à 0 : prix[0] vaut 250, prix[1] vaut 500 et prix[2] vaut 150.

2. Créer une liste

a) En extension

On écrit tous les éléments : notes = [12, 15, 9, 14]. Une liste vide s'écrit [].

b) Par ajouts successifs avec append

On part d'une liste vide et on ajoute les éléments un par un, à la fin, avec L.append(x). C'est très utile dans une boucle.

carres = []
for k in range(5):        # k prend les valeurs 0, 1, 2, 3, 4
    carres.append(k**2)
print(carres)             # [0, 1, 4, 9, 16]

c) En compréhension

On décrit la règle de construction en une seule ligne, comme en mathématiques où l'on écrit \(\{k^2 \mid k \in \{0,1,2,3,4\}\}\) :

carres = [k**2 for k in range(5)]                 # [0, 1, 4, 9, 16]
pairs  = [k for k in range(20) if k % 2 == 0]     # [0, 2, 4, ..., 18]

Exemple résolu : une liste de prix

Un commerçant de Lomé vend un sac de riz 1 500 F CFA. Construire la liste des prix de 1, 2, …, 6 sacs.

Voir la solution

Le prix de \(k\) sacs est \(1500k\), pour \(k\) allant de 1 à 6, donc range(1, 7) :

prix_sacs = [1500*k for k in range(1, 7)]
# [1500, 3000, 4500, 6000, 7500, 9000]

Cette liste a 6 éléments : prix_sacs[0] vaut 1500 (1 sac) et prix_sacs[5] vaut 9000 (6 sacs).

Que contient la liste [3*k for k in range(1, 5)] ?

  1. [3, 6, 9, 12, 15]
  2. [0, 3, 6, 9, 12]
  3. [3, 6, 9, 12]
range(1, 5) donne 1, 2, 3, 4 (5 est exclu), d'où 3, 6, 9 et 12.

On exécute L = [3, 8, 5] puis L.append(10). Que vaut len(L) ?

  1. 4
  2. 3
  3. 10
append ajoute un élément à la fin : L devient [3, 8, 5, 10], qui contient 4 éléments.

3. Parcourir une liste

Deux façons de parcourir une liste L :

for x in L:               # x prend successivement chaque valeur de L
    print(x)

for i in range(len(L)):   # i prend chaque indice : 0, 1, ..., len(L)-1
    print(i, L[i])

On utilise le parcours par indices quand on a besoin de la position (par exemple pour modifier L[i] ou pour savoir où se trouve le maximum).

L'algorithme de la somme (accumulateur)

flowchart LR
A[total vaut 0] --> B[Prendre l element suivant]
B --> C[Ajouter l element a total]
C --> D{Encore des elements}
D -- oui --> B
D -- non --> E[Afficher total]
def somme(L):
    total = 0
    for x in L:
        total = total + x
    return total

def moyenne(L):
    return somme(L) / len(L)

Exemple résolu : les notes d'Awa

Awa a obtenu les notes notes = [12, 15, 9, 14]. Calcule à la main ce que renvoie moyenne(notes).

Au départ, total = 0.
On ajoute chaque note : \(0+12=12\), puis \(12+15=27\), puis \(27+9=36\), puis \(36+14=50\).
La liste contient 4 notes, donc la moyenne vaut \(\dfrac{50}{4}=12{,}5\).

L'algorithme du maximum

def maximum(L):
    m = L[0]              # on suppose que le premier est le plus grand
    for x in L:
        if x > m:
            m = x         # on a trouvé plus grand : on le garde
    return m

Exemple résolu : la facture d'électricité la plus élevée

Les factures mensuelles d'une famille de Ouagadougou sont f = [12000, 8500, 15000, 9000] (en F CFA). Que renvoie maximum(f) ?

Voir la solution

On part de \(m = 12000\). 8500 n'est pas plus grand ; 15000 est plus grand, donc \(m = 15000\) ; 9000 n'est pas plus grand. La fonction renvoie 15000.

Que vaut c après : L = [4, 7, 2, 7, 9] puis c = 0 et, pour x dans L, si x == 7 alors c = c + 1 ?

  1. 1
  2. 2
  3. 7
La boucle compte les éléments égaux à 7 : il y en a deux (indices 1 et 3), donc c vaut 2.

4. Listes et suites numériques

Une liste permet de stocker les premiers termes d'une suite définie par récurrence, par exemple \(u_0 = 1\) et \(u_{n+1} = 2u_n + 1\).

def termes(n):
    u = 1
    L = [u]
    for k in range(n):
        u = 2*u + 1
        L.append(u)
    return L

Exemple résolu : que renvoie termes(4) ?

Au départ \(u_0 = 1\) et L = [1].
La boucle fait 4 tours : \(u_1 = 2\times 1+1 = 3\), \(u_2 = 2\times 3+1 = 7\), \(u_3 = 2\times 7+1 = 15\), \(u_4 = 2\times 15+1 = 31\).
Chaque terme est ajouté à la fin : la fonction renvoie [1, 3, 7, 15, 31], soit 5 termes, de \(u_0\) à \(u_4\).

Une suite explicite se construit directement en compréhension : pour \(v_n = n^2 - 1\), la liste [n**2 - 1 for n in range(6)] vaut [-1, 0, 3, 8, 15, 24].

Combien d'éléments contient la liste renvoyée par termes(10) ?

  1. 9
  2. 10
  3. 11
La liste contient déjà u0 au départ, puis la boucle ajoute 10 termes : 1 + 10 = 11 éléments.

Erreurs fréquentes

  • Commencer à compter à 1 : le premier élément est L[0].
  • Utiliser l'indice len(L), qui n'existe pas : le dernier est L[len(L)-1].
  • Oublier que range(a, b) s'arrête à \(b-1\).
  • Écrire L = L.append(x) : append modifie directement la liste et ne renvoie rien, on écrit simplement L.append(x).
  • Placer l'initialisation de l'accumulateur dans la boucle.

Récapitulatif

  • Une liste s'écrit entre crochets ; ses indices vont de \(0\) à \(n-1\) où \(n\) = len(L).
  • On la crée en extension, par append dans une boucle, ou en compréhension.
  • L[i] lit l'élément d'indice \(i\) ; L[i] = x le remplace.
  • On la parcourt avec for x in L ou for i in range(len(L)) pour calculer somme, moyenne, maximum, nombre d'occurrences, ou ranger les termes d'une suite.
Indice du premier élément
0 ; le dernier a l'indice len(L) - 1, ou -1.
L.append(x)
Ajoute x à la fin de la liste L.
Liste en compréhension
[expression for k in range(n)], avec éventuellement une condition if.
range(a, b)
Les entiers de a à b - 1 : la borne b est exclue.
Accumulateur
Variable initialisée avant la boucle (total = 0) et mise à jour à chaque tour.

Teste tes connaissances sur ce cours

Crée ton compte gratuitement pour accéder aux quiz associés et suivre ta progression.