Aller au contenu

03 Cours Listes

Version du cours sur Capytale

Définition⚓︎

Une liste est un objet pouvant contenir d’autres objets. Ces objets, appelés éléments, sont ordonnés de façon séquentielle, les uns à la suite des autres. C’est un conteneur dynamique dont le nombre et l’ordre des éléments peuvent varier.

Création avec des crochets⚓︎

On crée une liste en délimitant par des crochets [] les éléments qui la composent :

🐍 Script Python
L = ['egg', 'spam', 'spam', 'spam', 'bacon']

print(f"{L} est de type {type(L)}")
📋 Texte
['egg', 'spam', 'spam', 'spam', 'bacon'] est de type <class 'list'>

Une liste peut contenir n’importe quel type d’objets : liste de nombres, liste de chaînes, liste de listes, etc. En Python, on peut même avoir des listes contenant des objets différents.

🐍 Script Python
L0 = [1, 2]
L2 = [None, True, False, 0, 1, 2 ** 64, 3.14, '', 0 + 1j, 'abc']
L1 = []
L3 = [[1, 'azerty'], L0]

print(L0, L1)
print(L2)
print(L3)
📋 Texte
[1, 2] []
[None, True, False, 0, 1, 18446744073709551616, 3.14, '', 1j, 'abc']
[[1, 'azerty'], [1, 2]]

Création avec la fonction list()⚓︎

On peut utiliser la fonction list() pour créer une liste à partir d’autres séquences ou objets.

🐍 Script Python
a = list() # création d'une liste vide
b = list('bzzzzzt') # création d'une liste à partir de la chaîne de caractère 'bzzzzzt'

print(a)
print(b)
📋 Texte
[]
['b', 'z', 'z', 'z', 'z', 'z', 't']

Accès aux éléments d’une liste⚓︎

On accède aux éléments d’une liste grâce à un indice. Le premier élément est indicé 0.

🐍 Script Python
L = ['egg', 'spam', 'spam', 'spam', 'bacon']

print(L[0])
print(L[4])
📋 Texte
egg
bacon

Un dépassement d’indice produit une erreur :

🐍 Script Python
L = ['egg', 'spam', 'spam', 'spam', 'bacon']

print(L[10])
📋 Texte
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
IndexError: list index out of range

Il est possible de compter en négatif à partir de la fin :

🐍 Script Python
L = ['egg', 'spam', 'spam', 'spam', 'bacon']

print(L[-1])
📋 Texte
bacon

Mutabilité⚓︎

Les listes sont dites mutables: on peut modifier la séquence de ses éléments : ajouter ou enlever des éléments, modifier un élément existant.

Je remplace le deuxième élément :

🐍 Script Python
L = ['egg', 'spam', 'spam', 'spam', 'bacon']

L[1] = 'tomatoes'
print(L)
L[3] = 9
print(L)
📋 Texte
['egg', 'tomatoes', 'spam', 'spam', 'bacon']
['egg', 'tomatoes', 'spam', 9, 'bacon']

Fonctions et méthodes principales⚓︎

Il existe des fonctions prédéfinies qui peuvent prendre des listes en paramètre.

Par exemple, La longueur d’une liste est donnée par la fonction len()

🐍 Script Python
L1 = ['chat', 'chien', 'hamster']

print(L1)
print(len(L1))
📋 Texte
['chat', 'chien', 'hamster']
3

On a aussi l'opérateur in implémenté dans Python, qui permet de tester si un élément est dans une liste ou non. L'opérateur contraire est not in. Ces opérateurs renvoient des booléens, et peuvent utiliser dans des structures conditionnelles.

🐍 Script Python
L1 = ['chat', 'chien', 'hamster']
print('chat' in L1)
print('lapin' not in L1)
📋 Texte
True
True

On appelle méthode une fonction qui a été définie pour un certain type d'objets. La syntaxe est :

🐍 Script Python
objet.methode()

La plus importante à connaître absolument pour les listes est append(), qui ajoute un élément à la fin de la liste : L.append(element) ajoute un élément element à la fin de la liste L

🐍 Script Python
L1 = ['chat', 'chien', 'hamster']
L1.append('cheval')
if 'chien' not in L1:
    L1.append('chien')

print(L1)
print(len(L1))
📋 Texte
['chat', 'chien', 'hamster', 'cheval']
4

Parcours de listes⚓︎

Il y a deux manières de parcourir une liste : en indices, ou en éléments.

Parcours en indices :⚓︎

Les indices d'une liste vont de 0 à la len(liste)-1.
L'indice doit donc parcourir range(len(liste)) :

🐍 Script Python
semaine = ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche']

for indice in range(len(semaine)):
    print("jour", indice, ":", semaine[indice])
📋 Texte
0 : lundi
1 : mardi
2 : mercredi
3 : jeudi
4 : vendredi
5 : samedi
6 : dimanche

Parcours en éléments :⚓︎

La syntaxe est très simple, mais cela signifie qu'on ne compte pas utiliser l'indice de l'élement.

🐍 Script Python
semaine = ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche']

for element in semaine:
    print(element)
📋 Texte
lundi
mardi
mercredi
jeudi
vendredi
samedi
dimanche

Important ! Choisissez toujours des noms de variables adaptés au parcours que vous avez choisi.

  • Si vous choisissez un parcours en indices, appelez la variable "indice", ou "i", ou éventuellement "j" ou "k" si vous avez déjà utilisé "i".

  • Si vous choisissez un parcours en éléments, appelez la variable "élément", ou un nom qui représente l'objet en question : si c'est une liste de jours, vous pouvez appeler les éléments "jour".

Remarque Pour nommer les variables, pensez que for signifie "pour chaque" (et pas "pour tous"). La variable représentant les indices successifs ou les éléments successifs doit être au singulier. La liste, elle, peut s'appeler liste_de_trucs ou utiliser un pluriel, par exemple, produits pour une liste de produits.

🐍 Script Python
voyelles = ['a', 'e', 'i', 'o', 'u', 'y']

for lettre in voyelles:
    print(lettre)
📋 Texte
a
e
i
o
u
y

Parcours dans une matrice ou un tableau⚓︎

Une liste de listes permet de représenter un tableau, avec des lignes et des colonnes, ou une matrice en mathématiques). Il est souvent plus simple de considérer que la matrice est une liste composée des lignes (elles-mêmes des listes). On va donc d'abord parcourir les lignes, et dans chaque ligne on peut parcourir par colonne.

🐍 Script Python
matrice = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
n = len(matrice) # nombre de lignes
m = len(matrice[0]) # nombre de colonnes

for i in range(n): # pour chaque ligne
    print(f"ligne {i} de la matrice : ", end=" ")
    for j in range(m): # parcourir les colonnes de la ligne i
        print(matrice[i][j], end=' ')
    print("")
📋 Texte
ligne 0 de la matrice :  1 2 3 
ligne 1 de la matrice :  4 5 6 
ligne 2 de la matrice :  7 8 9 
ligne 3 de la matrice :  10 11 12

Construire une liste dans une boucle avec append⚓︎

Lorsqu'il n'est pas possible ou pas pratique de créer la liste en entier de manière figée lors de sa définition, il est souvent utile de la construire dans une boucle.

  • On initialise alors la liste comme vide.
  • Puis dans la boucle, on utilise .append(element) pour ajouter les éléments au fur et à mesure.

Par exemple, une liste de nombres qui dépende d'un paramètre :

🐍 Script Python
n = int(input("Combien voulez-vous de nombres ?"))
L1 = []
for i in range(n):
    L1.append(2*i)
print(L1)

Cela peut aussi permettre de mettre une condition pour ajouter l'élément ou non.

Compréhension de listes⚓︎

En Python, il est possible de définir une liste par filtrage du contenu d’une énumération selon un principe analogue à une définition mathématique.

Syntaxe⚓︎

🐍 Script Python
nom_liste = [element for ...] #au moins 1 parcours séquentiel avec une boucle for
# ou
nom_liste = [element for ... if ...] #possibilité d'ajouter des conditions, après les for

Exemples⚓︎

🐍 Script Python
L1 = [x for x in range(12) if x * x <= 40 or x * x > 80]

print(L1)
📋 Texte
[0, 1, 2, 3, 4, 5, 6, 9, 10, 11]
🐍 Script Python
a, b = [1, 3, 5], [2, 4, 6]

L2 = [(x, y) for x in a for y in b]

print(L2)
📋 Texte
[(1, 2), (1, 4), (1, 6), (3, 2), (3, 4), (3, 6), (5, 2), (5, 4), (5, 6)]

Un triplet pythagoricien est un triplet \((x,y,z) \in \left(\mathbb{N}^{*}\right)^3\) tels que \(x^2+y^2=z^2\).

🐍 Script Python
L3 = [(x, y, z) for x in range(1, 20) for y in range(x, 20)
      for z in range(y, 20) if x * x + y * y == z * z]

print(L3)
📋 Texte
[(3, 4, 5), (5, 12, 13), (6, 8, 10), (8, 15, 17), (9, 12, 15)]

Passer de la compréhension de liste au append ou réciproquement⚓︎

Les éléments de syntaxe qui se trouvent dans la compréhension de liste se retrouvent dans une structure avec for / append.

Vous pouvez donc passer de l'un à l'autre suivant vos besoins.

L1 = [x for x in range(11) if x * x <= 40 or x * x > 80]
L1 = []
for x in range(11):
    if x * x <= 40 or x * x > 80:
        L1.append(x)


a, b = [1, 3, 5], [2, 4, 6]
L2 = [(x, y) for x in a for y in b]
a, b = [1, 3, 5], [2, 4, 6]
L2 = []
for x in a:
    for y in b:
        L2.append((x, y))

Le stockage en mémoire⚓︎

  • Exemple 1 :
    🐍 Script Python
    L0 = [None, True, False, 0, 1, 2 ** 64, 3.14, '', 0 + 1j, 'abc']
    
    La variable L0 va être sauvegardée en stockant : l'adresse mémoire du 1er élément de la liste, et la longueur de la liste.
    À partir de l'adresse du 1er élément de la liste, on a des emplacements mémoires contigus, tous de même taille, qui enregistrent les adresses des objets.
    Les objets contenus peuvent être de types différents, de tailles différentes, et sont stockés ailleurs.
    Cela permet permet de modifier la taille de l'un des éléments sans décaler tous les éléments en mémoire.

En conséquence, une variable liste ne stocke qu'une adresse.
Affecter la valeur d'une liste à une autre liste lui affecte la même adresse. Elles sont alors liées et toute modification sur l'une modifie en fait l'autre.

  • Exemple 2 :
    🐍 Script Python
    L1 = ['a', 'b']
    L2 = L1
    L2[1] = 'c'
    
    print(L1)
    print(L2)
    

Illustration avec le site python tutor.

Lorsque ce phénomène n'est pas ce que l'on souhaite, on réalise une copie de la 1ère liste pour l'affecter à la 2e.
On peut créer une nouvelle liste en recopiant tous les éléments avec :
L2 = L1[:], ou L2 = list(L1), ou L2 = L1.copy().