03 Cours Listes
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 :
L = ['egg', 'spam', 'spam', 'spam', 'bacon']
print(f"{L} est de type {type(L)}")
['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.
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)
[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.
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)
[]
['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.
L = ['egg', 'spam', 'spam', 'spam', 'bacon']
print(L[0])
print(L[4])
egg
bacon
Un dépassement d’indice produit une erreur :
L = ['egg', 'spam', 'spam', 'spam', 'bacon']
print(L[10])
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 :
L = ['egg', 'spam', 'spam', 'spam', 'bacon']
print(L[-1])
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 :
L = ['egg', 'spam', 'spam', 'spam', 'bacon']
L[1] = 'tomatoes'
print(L)
L[3] = 9
print(L)
['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()
L1 = ['chat', 'chien', 'hamster']
print(L1)
print(len(L1))
['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.
L1 = ['chat', 'chien', 'hamster']
print('chat' in L1)
print('lapin' not in L1)
True
True
On appelle méthode une fonction qui a été définie pour un certain type d'objets. La syntaxe est :
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
L1 = ['chat', 'chien', 'hamster']
L1.append('cheval')
if 'chien' not in L1:
L1.append('chien')
print(L1)
print(len(L1))
['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)) :
semaine = ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche']
for indice in range(len(semaine)):
print("jour", indice, ":", semaine[indice])
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.
semaine = ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche']
for element in semaine:
print(element)
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.
voyelles = ['a', 'e', 'i', 'o', 'u', 'y']
for lettre in voyelles:
print(lettre)
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.
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("")
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 :
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⚓︎
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⚓︎
L1 = [x for x in range(12) if x * x <= 40 or x * x > 80]
print(L1)
[0, 1, 2, 3, 4, 5, 6, 9, 10, 11]
a, b = [1, 3, 5], [2, 4, 6]
L2 = [(x, y) for x in a for y in b]
print(L2)
[(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\).
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)
[(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 PythonLa 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.
L0 = [None, True, False, 0, 1, 2 ** 64, 3.14, '', 0 + 1j, 'abc']
À 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().