Cours de Première

Algorithmique : la notion de liste

Créer, parcourir et modifier une liste en Python, en extension ou en compréhension, et écrire des fonctions qui travaillent sur des listes.

Avant de commencer

  • Écrire une boucle bornée et une boucle non bornée.
  • Définir et appeler une fonction Python.

À la fin du chapitre, tu sais

  • Générer une liste en extension, par ajouts successifs ou en compréhension.
  • Accéder à un élément par son indice et modifier une liste.
  • Parcourir une liste par indices ou par éléments.
  • Écrire une fonction qui renvoie une somme, un maximum, une moyenne.
Sommaire

I. Créer une liste

Une liste rassemble plusieurs valeurs sous un seul nom, dans un ordre fixé. Là où une variable ne retient qu'un nombre, une liste en retient autant qu'on veut, ce qui permet de travailler sur une série entière.

DéfinitionDéfinition en extension

Définir une liste en extension consiste à écrire tous ses éléments, séparés par des virgules, entre crochets.

notes = [12, 15, 8, 17, 11]

La liste vide s'écrit [], et la fonction len donne le nombre d'éléments : ici, len(notes) vaut 55.

DéfinitionConstruction par ajouts successifs

La méthode append ajoute un élément à la fin d'une liste. Partir d'une liste vide et la remplir dans une boucle est le schéma le plus courant.

carres = []
for i in range(1, 11):
    carres.append(i * i)

À la fin, la liste carres contient les carrés des entiers de 11 à 1010.

DéfinitionDéfinition en compréhension

La définition en compréhension décrit la liste par la règle qui produit ses éléments, à la manière d'un ensemble défini par une propriété.

carres = [i * i for i in range(1, 11)]
pairs = [n for n in range(20) if n % 2 == 0]

La première ligne remplace la boucle précédente. La seconde ajoute une condition de filtrage.

Remarque

Les deux écritures produisent exactement la même liste. La compréhension est plus courte, la boucle plus souple lorsque le calcul de chaque terme demande plusieurs lignes.

II. Indices et modification

DéfinitionAccéder à un élément

Chaque élément d'une liste porte un numéro de position appelé indice. La numérotation commence à zéro.

notes = [12, 15, 8, 17, 11]
notes[0]    # 12, le premier élément
notes[4]    # 11, le dernier
notes[-1]   # 11 également, en comptant depuis la fin
Attention

Une liste de nn éléments a des indices allant de 00 à n1n-1. Écrire notes[5] pour une liste de cinq éléments provoque une erreur. Ce décalage d'une unité est la première source de bugs sur les listes.

PropriétéModifier une liste
instructioneffet
L[i] = vremplace l'élément d'indice ii par vv
L.append(v)ajoute vv à la fin
L.insert(i, v)insère vv à l'indice ii
L.remove(v)supprime la première occurrence de vv
del L[i]supprime l'élément d'indice ii

Ces instructions modifient la liste sur place, sans en créer une nouvelle.

III. Parcourir une liste

DéfinitionDeux façons de parcourir

Le parcours par éléments convient lorsque seule la valeur compte.

for note in notes:
    print(note)

Le parcours par indices devient nécessaire lorsque la position elle-même intervient, par exemple pour comparer deux listes de même longueur.

for i in range(len(notes)):
    print(i, notes[i])
ExempleSomme et moyenne
def somme(L):
    s = 0
    for x in L:
        s = s + x
    return s

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

La seconde fonction réutilise la première : c'est le principe de la programmation modulaire, où chaque fonction fait une seule chose et sert de brique aux suivantes.

ExempleChercher le maximum
def maximum(L):
    m = L[0]
    for x in L:
        if x > m:
            m = x
    return m

La variable m retient le plus grand élément rencontré jusque-là. Elle est initialisée avec le premier élément, et non avec zéro, sans quoi une liste de nombres négatifs donnerait un résultat faux.

MéthodeÉcrire une fonction sur une liste

Le schéma est presque toujours le même : initialiser une variable de travail, parcourir la liste en mettant cette variable à jour, puis renvoyer le résultat après la boucle.

L'erreur classique consiste à placer le return à l'intérieur de la boucle : la fonction s'arrête alors au premier tour, sans avoir vu le reste de la liste.

IV. Listes et suites numériques

Les listes servent naturellement à stocker les premiers termes d'une suite, notion étudiée dans le chapitre d'algèbre de l'année.

ExemplePremiers termes d'une suite récurrente

Pour la suite définie par u0=2u_0=2 et un+1=3un1u_{n+1}=3u_n-1 :

def premiers_termes(n):
    L = [2]
    for i in range(n):
        L.append(3 * L[-1] - 1)
    return L

L'écriture L[-1] désigne le dernier terme calculé, c'est-à-dire celui dont on a besoin pour obtenir le suivant.

ExempleLa suite de Fibonacci
def fibonacci(n):
    L = [0, 1]
    for i in range(n):
        L.append(L[-1] + L[-2])
    return L
ExempleRecherche d'un seuil

Une boucle non bornée convient lorsque le nombre d'étapes n'est pas connu à l'avance.

def seuil(limite):
    u = 2
    n = 0
    while u <= limite:
        u = 3 * u - 1
        n = n + 1
    return n

La fonction renvoie le rang à partir duquel la suite dépasse la valeur demandée.

Passer à la pratique

9 exercices corrigés sur ce chapitre.