Liste⚓︎
Une liste d'éléments (list, de type list
) est un objet Python mutable.
- On pourra modifier les éléments d'une liste, chose qu'on ne pouvait pas faire avec un objet de type
str
, immuable. - On pourra ajouter ou supprimer des éléments à une liste.
- On ne pourra pas utiliser un objet de type
list
comme une clé de dictionnaire, comme on pourrait le faire avec un objet de typestr
.
À part cette grande différence, il y a de nombreux points communs entre str
et list
pour les débutants. Nous allons voir comment construire, accéder, modifier, itérer, et d'autres méthodes.
Création⚓︎
En dur⚓︎
Pour créer une liste dans un code Python, on utilise les délimiteurs :
[
: pour débuter]
: pour finir,
: pour séparer
On sépare les éléments par des virgules.
⚠️ Même s'il est possible de construire des listes avec des éléments de types différents, nous le déconseillons.
semaine = ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"]
nb_premiers = [2, 3, 5, 7, 11]
hauteurs = [1.82, 1.75, 1.68, 1.89]
liste_vide = []
liste_avec_un_élément = [1337]
Par conversion⚓︎
On peut convertir un tuple
, ou une str
en list
.
>>> point_M = (5, 8)
>>> list(point_M)
[5, 8]
>>> mot = "former"
>>> list(mot)
['f', 'o', 'r', 'm', 'e', 'r']
>>>
Par concaténation⚓︎
Il est possible de concaténer des listes, mais on recommande d'éviter, pour plusieurs raisons. On ne le ferra qu'en dernier recours, ou dans des cas d'exemples simples.
Méthodes à éviter
On peut concaténer deux listes avec l'opérateur +
.
>>> [2, 3, 5, 7] + [11]
[2, 3, 5, 7, 11]
Ceci n'est pas une bonne méthode pour ajouter un élément à une liste ! Ici, une nouvelle liste est créée. Pour une grande liste, avec plusieurs ajouts, il faut changer de méthode. À suivre...
On peut aussi répéter une concaténation avec l'opérateur *
.
>>> 3 * [0]
[0, 0, 0]
Ceci est une méthode pratique pour initialiser un vecteur nul, et on la voit souvent. Mais elle est piégeuse pour construire des matrices ! On en verra une moins pratique, mais sans piège.
⚠️ Le programme officiel préconise plutôt une autre méthode, la construction des listes en compréhension.
Les listes en compréhension⚓︎
Définition simplifiée d'itérable : que l'on peut utiliser dans une boucle for
.
Par exemple un objet de type str
, tuple
ou list
est itérable.
La syntaxe Python générale d'une création de liste en compréhension est :
<nom_liste> = [ <élément(it)> for it in itérable if <condition(it)> ]
Elle permet de créer une liste d'images (au sens des fonctions en mathématiques) depuis une liste d'antécédents, et avec la possibilité de filtrer suivant une condition.
Voyons des exemples progressifs.
>>> [0 for _ in range(5)]
[0, 0, 0, 0, 0]
>>> [lettre + "_" for lettre in "azerty"]
['a_', 'z_', 'e_', 'r_', 't_', 'y_']
>>> [i*i for i in range(6)]
[0, 1, 4, 9, 16, 25]
>>> [i*i for i in range(20) if i * i % 10 == 9]
[9, 49, 169, 289]
- Une bonne façon de créer une liste remplie de
. - L'itérable peut être une chaîne, une liste, ou un
range
, ou tout itérable... - La liste des 6 premiers carrés.
- Le dernier exemple donne la liste des 20 premiers carrés, filtrée en ne conservant que ceux qui se terminent par un 9.
C'est la bonne méthode à essayer d'utiliser le plus possible. On appelle ce style de programmation, le style fonctionnel, il fait penser fortement à une écriture mathématique.
Indices⚓︎
Les listes sont indicées à partir de zéro.
>>> semaine[0]
'lundi'
>>> nb_premiers = [2, 3, 5, 7, 11]
>>> nb_premiers[3]
7
Technique avancée
Comme avec str
, les indices négatifs sont autorisés en Python, tout comme les tranches.
Copie de liste⚓︎
⚠️ Point délicat à signaler. Voyons deux façons de copier une liste.
>>> ma_liste = [10, 11, 12, 13, 14]
>>> ma_liste_copie1 = ma_liste
>>> ma_liste_copie2 = ma_liste[:]
- La première ligne définit une liste.
- La seconde ligne fait pointer
ma_liste_copie1
sur la même liste, nous avons deux variables qui pointent vers le même objet. - La troisième ligne réalise une copie réelle de toute la tranche, ainsi on obtient une autre liste qui a le même contenu. C'est différent.
La preuve :
>>> ma_liste[0] = -1
>>> ma_liste_copie1
[-1, 11, 12, 13, 14]
>>> ma_liste_copie2
[10, 11, 12, 13, 14]
>>>
On constate qu'en modifiant ma_liste
:
ma_liste_copie1
est modifiée également ; oui, c'est bien le même objet de typelist
!ma_liste_copie2
n'est pas modifiée ; en effet, c'était une copie devenue indépendante !
Longueur⚓︎
Comme avec str
, on utilise la fonction len
(pour length, longueur), pour connaître le nombre d'éléments d'une liste.
>>> hauteurs = [1.82, 1.75, 1.68, 1.89]
>>> len(hauteurs)
4
>>>
Appartenance⚓︎
Comme avec str
, x in ma_liste
renvoie un booléen, la réponse à : x
est-il dans ma_liste
?
Itération⚓︎
Comme avec str
, on peut itérer sur une liste de deux manières différentes.
Itération avec indice⚓︎
hauteurs = [1.82, 1.75, 1.68, 1.89]
nb_élements = len(hauteurs)
somme = 0.0
for i in range(nb_éléments):
somme = somme + hauteurs[i]
print("La hauteur totale est", somme)
La hauteur totale est 7.14
Itération sans indice⚓︎
hauteurs = [1.82, 1.75, 1.68, 1.89]
somme = 0.0
for h in hauteurs:
somme = somme + h
print("La hauteur totale est", somme)
La hauteur totale est 7.14
On constate que la deuxième méthode est bien plus simple. Elle est très utile lorsqu'on n'a pas besoin de l'indice pendant la boucle.
Voyons maintenant des méthodes alternatives de construction de liste.
Exercices⚓︎
- Quel est le plus grand entier inférieur à
dont le carré fini par69
? - Quelle est la somme de ces carrés ?
Réponses
>>> max([n for n in range(1000) if n * n % 100 == 69])
987
>>> sum([n*n for n in range(1000) if n * n % 100 == 69])
13330760
>>>
On découvre, au passage, qu'il existe des fonctions classiques sur les listes :
min()
pour le minimum d'une liste non vide ;max()
pour le maximum d'une liste non vide ;sum()
pour la somme d'une liste ;len()
pour la longueur d'une liste ;sorted()
pour renvoyer une copie triée de la liste.
>>> len([2, 3, 5, 7, 11, 13])
6
>>> sorted(['a_', 'z_', 'e_', 'r_', 't_', 'y_'])
['a_', 'e_', 'r_', 't_', 'y_', 'z_']
Pour le dernier exemple, on constate que Python sait faire la comparaison de chaînes de caractères, donc il peut trier des listes de nombres tout comme les listes de chaînes de caractères.
Les listes dynamiques de Python⚓︎
D'un point de vue rigoureux, les listes que nous avons présentées précédemment sont des tableaux, des objets :
- à taille fixée à la création,
- avec des éléments indicés de
inclus à longueur exclue, - des éléments qui sont eux-mêmes de même type, tous des entiers, ou bien tous des chaînes de caractères...
Les tableaux sont utilisés dans presque tous les langages de programmation, c'est un outil élémentaire.
Les listes Python offrent d'autres possibilités que les tableaux officiels n'ont pas. Avec une liste Python, on peut :
- ajouter des éléments à la fin avec
.append()
- récupérer en enlevant l'élément de fin avec
.pop()
- trier en place la liste avec
.sort()
>>> premiers = [2, 3, 5, 7]
>>> premiers.append(11)
>>> premiers
[2, 3, 5, 7, 11]
>>> dernier = premiers.pop()
>>> dernier
11
>>> premiers
[2, 3, 5, 7]
En techniques avancées non recommandées, on peut :
- modifier des tranches par d'autres tranches même de longueur différente, ...
- avoir des types différents pour les éléments.
⚠️ Essayez de ne pas utiliser ces méthodes dynamiques avancées. Les exercices pour débutants utilisent souvent les tableaux et non les listes dynamiques. En terminale, on pourra utiliser des méthodes dynamiques simples.
.sort()
et sorted()
à ne pas confondre⚓︎
ma_liste.sort()
: trie en placema_liste
, l'ordre original est perdu.ma_liste_triée = sorted(ma_liste)
: renvoie une copie triée de la liste, l'originale est intacte. C'est utile uniquement quand on souhaite ne pas modifier la liste de départ.
Les listes de listes⚓︎
- Une liste peut contenir des objets tout type.
- On rappelle qu'on préfère ne pas mélanger les types à l'intérieur d'une liste.
- Une liste peut contenir elle-même des listes. C'est souvent le cas dans le cas de travail avec des images.
Une image est souvent donnée par une liste de lignes. Chaque ligne est donnée par une liste de pixels. Et un pixel est souvent une liste de composantes de couleurs.
Exercice⚓︎
Compléter la définition de la liste qui correspond à l'image en noir et blanc ci-dessous.
ligne0 = [0, 0 ,1, 1, 1, 1, 0, 0]
ligne1 = [0, 1, 0...
...
ligne7 = ... 1, 0, 0]
smile = [ligne0, ligne1, ligne2, ... ligne7]
On peut aussi écrire :
smile = [[0,0,1,1,1,1,0,0], [0,1,0,...], ..., [...1,0,0]]
Pour modifier un pixel, on peut faire :
smile[2][4] = 0
Comment lire smile[2][4]
?
smile
est une liste de lignes, on veut celle d'indice , c'estsmile[2]
qui est une liste d'entiers, un par colonne, on veut celui d'indice .smile[2][4]
correspond donc au pixel de la ligne d'indice , et de la colonne d'indice .