Définition

Les listes font partie de ce qu'on appelle les données composites (nous verrons plus tard les tuples et les dictionnaires). Elles permettent de regrouper de manière structurée des ensembles de valeurs. On les appelle listes en Python, ou bien tableaux de manière plus générale.

Notation : dans une liste, les éléments sont séparés par des virgules, et l'ensemble est délimité par des crochets.

In [ ]:
ma_premiere_liste = [1, "ok", True]

Même si cela n'a ici un grand intérêt, les éléments d'une liste peuvent donc être de types différents : ici, nous avons successivement un entier (int), une chaine de caractères (str), et un booléen (bool).

Accès aux éléments d'une liste

On accède à un élément d'une liste en mettant entre crochets l'indice de l'élémént (qui commence à zéro).

In [ ]:
famille = ["Bart", "Lisa", "Maggie"]
In [ ]:
famille[0]

Un indice qui dépasse la valeur  longueur de la liste -1 provoquera une erreur list index out of range.

In [ ]:
famille[3]

Il est par contre possible d'utiliser des indices négatifs :

In [ ]:
famille[-1]

Longueur d'une liste

La longueur d'une liste sera donnée par la fonction len()

In [ ]:
len(famille)

Attention : le dernier élément de la liste a donc l'indice len(liste)-1

Parcours des éléments d'une liste

In [ ]:
for k in range(len(famille)):
    print(famille[k])

Remarque : nous avons déjà vu une méthode plus directe de parcours d'une liste :

In [ ]:
for k in famille :  # <- beaucoup plus efficace !
    print(k)

Les éléments d'une liste sont MODIFIABLES.

C'est une différence fondamentale avec une autre structure (les tuples) que nous verrons plus tard.

In [ ]:
famille[0] = "Milhouse"
In [ ]:
famille

On dit que les listes sont des objets mutables.

Ajout d'un élement à une liste : méthode append()

In [ ]:
famille.append("Lisa")
In [ ]:
famille

La méthode append() rajoute donc un élément à la fin de la liste.

Liste vide

Très souvent, la méthode append() ci-dessus est utilisée à partir d'une liste vide [], à laquelle on rajoute peu à peu des éléments.

Exemple

Filtrons la liste m ci-dessous pour n'en garder que les éléments supérieurs à 20.

In [ ]:
m = [45, 12, 15, 20, 18, 19, 23, 17, 12, 18]
p = []

for k in m :
    if k > 20:
        p.append(k)

Suppression d'un élément d'une liste ...

... par la méthode remove() :

In [ ]:
famille.remove("Lisa")
In [ ]:
famille

La méthode remove() va supprimer le premier élément de la liste (ce qui est problématique s'il y en a plusieurs) qui correspond à l'élément passé en argument.

In [ ]:
maliste = [8, 4, 2, 4, 7]
maliste.remove(4)
In [ ]:
maliste
In [ ]:
maliste.remove(5)

... par la fonction del() :

La fonction del() permet de supprimer un élément en donnant son indice.

In [ ]:
maliste = [8, 4, 2, 5, 7]
del maliste[3]
In [ ]:
maliste
In [ ]:
 

Exercice :

Trouvez le nombre qui est exactement à la même place dans la liste a et dans la liste b (les deux listes ont la même taille)

In [ ]:
a = [8468, 4560, 3941, 3328, 7, 9910, 9208, 8400, 6502, 1076, 5921, 6720, 948, 9561, 7391, 7745, 9007, 9707, 4370, 9636, 5265, 2638, 8919, 7814, 5142, 1060, 6971, 4065, 4629, 4490, 2480, 9180, 5623, 6600, 1764, 9846, 7605, 8271, 4681, 2818, 832, 5280, 3170, 8965, 4332, 3198, 9454, 2025, 2373, 4067]
b = [9093, 2559, 9664, 8075, 4525, 5847, 67, 8932, 5049, 5241, 5886, 1393, 9413, 8872, 2560, 4636, 9004, 7586, 1461, 350, 2627, 2187, 7778, 8933, 351, 7097, 356, 4110, 1393, 4864, 1088, 3904, 5623, 8040, 7273, 1114, 4394, 4108, 7123, 8001, 5715, 7215, 7460, 5829, 9513, 1256, 4052, 1585, 1608, 3941]


"""placer ici votre programme"""
In [ ]:
 

Construction d'une liste d'éléments identiques

In [ ]:
p = [0]*12
In [ ]:
p

Cette instruction est très utile pour initialiser des listes de taille donnée.

Exemple

le code ci-dessous compte l'occurence de chaque lettre de l'alphabet dans un texte.

In [ ]:
texte = "ce texte est prodigieusement ennuyeux"

def rang(lettre):
    return(ord(lettre)-97)

compt = [0]*26
for k in texte :
    if k != " " :
        compt[rang(k)] += 1
In [ ]:
compt

Construction d'une liste (méthode dite par compréhension)

In [ ]:
nombres = [k for k in range(10)]
In [ ]:
nombres

Il est bien sûr possible d'agir sur le paramètre :

In [ ]:
carres_parfaits = [k**2 for k in range(10)]
In [ ]:
carres_parfaits

Plus subtil, on peut filtrer "à la volée" les éléments pour n'en garder que certains.

In [ ]:
c = [n for n in carres_parfaits if n % 3 == 0]
In [ ]:
c

Exercice

En une ligne, créez la liste p qui contient tous les éléments positifs de m.

In [ ]:
m = [-3, -6, 4, 7, -2, 1, -3, 5]
p = ["..."]
In [ ]:
p

Un phénomène inquiétant : la copie de liste

In [ ]:
a = 3
b = a
a = 5
In [ ]:
id(a)
In [ ]:
id(b)
In [ ]:
b
In [ ]:
a = [4, 5, 7]
b = a
a[0] = 12

Selon toute vraisemblance, la liste a est maintenant égale à [12, 5, 7]. Vérifions-le :

In [ ]:
id(a)
In [ ]:
id(b)
In [ ]:
a

Tout est donc normal. Mais :

In [ ]:
b

b est lui aussi devenu égal à [12, 5, 7], alors que la modification sur l'élément a[0] n'a été faite qu'après l'affectation b = a.
Les listes a et b sont en fait strictement et définitivement identiques, elles sont simplement deux dénominations différentes d'un même objet. On peut le vérifier en regardant l'emplacement-mémoire vers lequel pointent la variable a et la variable b :

In [ ]:
id(a)
In [ ]:
id(b)

Comment copier le contenu d'une liste vers une autre

Parmi plusieurs solutions, celle-ci est simple et efficace : la méthode copy()

In [ ]:
a = [3, 4, 9]
b = a.copy()
a[0] = 12
In [ ]:
a
In [ ]:
b

On pourrait aussi écrire b = list(a) mais la méthode copy() a l'avantage d'exister aussi pour les dictionnaires, que nous verrons plus tard.

Tableaux à plusieurs dimensions : listes de listes

In [ ]:
a = [[3, 5, 2],
     [7, 1, 4], 
     [8, 6, 9]]

La liste a est composée de 3 éléments qui sont eux-même des listes de 3 éléments.

In [ ]:
a[0]
In [ ]:
a[0][1]
In [ ]:
a[2][2]

Exercice 1

Résolvez ce pydéfi

In [ ]:
 

Exercice 2 : Pydéfi : Le sanglier d'Erymanthe

https://callicode.fr/pydefis/Herculito04Sanglier/txt

In [ ]: