📚 Le cours : listes, tuples, dictionnaires et ensembles
Un programme garde rarement une seule valeur : il manipule des collections (les notes d'une classe, un annuaire, les mots d'un texte…). Python en propose quatre, qui diffèrent par ce qu'on peut leur faire : modifier leur contenu, garder l'ordre, accepter les doublons, retrouver un élément rapidement.
| Structure | Ordonnée | Modifiable | Doublons | On retrouve un élément par… | Quand l'utiliser |
list | oui | oui | oui | son indice | une suite de valeurs qui évolue |
tuple | oui | non | oui | son indice | un petit groupe fixe (coordonnées, résultats multiples) |
dict | oui (ordre d'insertion) | oui | clés uniques | sa clé | associer une valeur à un nom |
set | non | oui | non | un test d'appartenance | éliminer les doublons, comparer des groupes |
Les listes : créer et lire
Une liste s'écrit entre crochets. Ses éléments sont numérotés à partir de 0 ; un indice négatif compte depuis la fin (-1 est le dernier). Une tranche liste[debut:fin:pas] crée une nouvelle liste (le début est inclus, la fin est exclue).
notes = [12, 15, 9, 18]
print(notes[0], notes[-1], len(notes))
print(notes[1:3], notes[:2], notes[2:], notes[::2], notes[::-1])
print(15 in notes, 20 in notes)
vide = []
melange = [1, "a", 2.5, [3, 4]]
print(len(vide), melange[3][0])
Affichage12 18 4
[15, 9] [12, 15] [9, 18] [12, 9] [18, 9, 15, 12]
True False
0 3
Les listes : modifier
Une liste est modifiable : on peut changer un élément, en ajouter ou en retirer, sans en créer une nouvelle.
liste = [3, 1, 2]
liste.append(4)
liste.insert(0, 9)
liste.extend([5, 6])
print(liste)
liste.remove(1)
dernier = liste.pop()
premier = liste.pop(0)
print(liste, dernier, premier)
liste[0] = 100
del liste[1]
print(liste, liste.index(100), liste.count(100))
Affichage[9, 3, 1, 2, 4, 5, 6]
[3, 2, 4, 5] 6 9
[100, 4, 5] 0 1
append(x) ajoute à la fin ; insert(i, x) insère à l'indice i ; extend(autre) ajoute tous les éléments d'une autre liste.
remove(x) retire la première valeur égale à x ; pop() retire et renvoie le dernier élément, pop(i) celui d'indice i ; del liste[i] supprime sans rien renvoyer.
index(x) donne la position de x (erreur s'il est absent) ; count(x) compte ses occurrences.
Trier une liste
liste.sort() trie en place (et renvoie None) ; sorted(liste) renvoie une nouvelle liste triée et laisse l'originale intacte. Les deux acceptent reverse=True et key=fonction pour trier selon un autre critère. Le tri est stable : deux éléments de même clé gardent leur ordre d'origine.
nombres = [5, 2, 9, 1]
print(sorted(nombres), nombres)
nombres.sort(reverse=True)
print(nombres)
mots = ["python", "C", "java", "Rust"]
print(sorted(mots))
print(sorted(mots, key=len))
print(sorted(mots, key=str.lower))
Affichage[1, 2, 5, 9] [5, 2, 9, 1]
[9, 5, 2, 1]
['C', 'Rust', 'java', 'python']
['C', 'java', 'Rust', 'python']
['C', 'java', 'python', 'Rust']
Les majuscules passent avant les minuscules dans l'ordre alphabétique de Python (leurs codes sont plus petits) : key=str.lower trie sans tenir compte de la casse.
Copier une liste : alias et copies
b = a ne copie pas la liste : a et b désignent le même objet, et modifier l'un modifie l'autre. Pour une copie indépendante, utilise a.copy(), list(a) ou a[:]. Attention : la copie est « superficielle », donc les listes imbriquées restent partagées (voir aliasing et copies).
a = [1, 2, 3]
b = a
c = a.copy()
b.append(4)
print(a, b, c)
grille = [[0] * 2 for _ in range(2)]
grille[0][0] = 1
print(grille)
Affichage[1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3]
[[1, 0], [0, 0]]
Les tuples
Un tuple s'écrit entre parenthèses (elles sont facultatives) : c'est une liste non modifiable. On l'utilise pour un petit groupe de valeurs liées (coordonnées, date) et pour renvoyer plusieurs valeurs d'une fonction. Le déballage (x, y = point) range chaque élément dans une variable, et permet d'échanger deux variables sans variable temporaire. Un tuple d'un seul élément s'écrit avec une virgule : (5,).
point = (3, 4)
x, y = point
print(x, y, point[0], len(point))
a, b = 1, 2
a, b = b, a
print(a, b)
premier, *reste = (10, 20, 30)
print(premier, reste)
seul = (5,)
print(type(seul), type((5)))
Affichage3 4 3 2
2 1
10 [20, 30]
<class 'tuple'> <class 'int'>
Les dictionnaires : lire et modifier
Un dictionnaire associe une valeur à chaque clé. On accède à une valeur par sa clé : d[cle] (erreur si elle manque) ou d.get(cle, defaut) (valeur par défaut si elle manque). Les clés sont uniques et doivent être non modifiables (nombre, texte, tuple). Depuis Python 3.7, un dictionnaire conserve l'ordre dans lequel on a ajouté ses clés.
eleve = {"nom": "Ada", "age": 17, "notes": [18, 15]}
print(eleve["nom"], eleve.get("age"), eleve.get("ville", "inconnue"))
eleve["ville"] = "Lyon"
eleve["age"] = 18
del eleve["notes"]
print(eleve)
print("nom" in eleve, "notes" in eleve, len(eleve))
AffichageAda 17 inconnue
{'nom': 'Ada', 'age': 18, 'ville': 'Lyon'}
True False 3
Parcourir un dictionnaire
Une boucle for sur un dictionnaire parcourt ses clés. .keys(), .values() et .items() donnent respectivement les clés, les valeurs et les couples (clé, valeur). max(d, key=d.get) renvoie la clé qui a la plus grande valeur.
prix = {"pomme": 1.2, "poire": 1.5, "kiwi": 0.8}
for fruit in prix:
print(fruit)
print(list(prix.keys()), list(prix.values()))
for fruit, p in prix.items():
print(f"{fruit} : {p:.2f} €")
print(max(prix, key=prix.get))
Affichagepomme
poire
kiwi
['pomme', 'poire', 'kiwi'] [1.2, 1.5, 0.8]
pomme : 1.20 €
poire : 1.50 €
kiwi : 0.80 €
poire
Dictionnaires : compter et regrouper
Deux schémas reviennent sans cesse. Compter : compte[m] = compte.get(m, 0) + 1. Regrouper : groupes.setdefault(cle, []).append(x) crée la liste de la clé si elle n'existe pas encore, puis y ajoute x.
mots = ["a", "b", "a", "c", "a", "b"]
compte = {}
for m in mots:
compte[m] = compte.get(m, 0) + 1
print(compte)
groupes = {}
for nom, classe in [("Ada", "1A"), ("Lin", "1B"), ("Max", "1A")]:
groupes.setdefault(classe, []).append(nom)
print(groupes)
Affichage{'a': 3, 'b': 2, 'c': 1}
{'1A': ['Ada', 'Max'], '1B': ['Lin']}
Construire un dictionnaire
On peut construire un dictionnaire avec dict(zip(cles, valeurs)), avec une compréhension {cle: valeur for …}, ou le compléter avec update. pop(cle) retire une clé et renvoie sa valeur. Les valeurs peuvent elles-mêmes être des dictionnaires : c'est la structure du format JSON.
noms = ["Ada", "Lin"]
notes = [18, 17]
carnet = dict(zip(noms, notes))
carres = {n: n ** 2 for n in range(4)}
carnet.update({"Max": 12})
print(carnet)
print(carres)
print(carnet.pop("Lin"), carnet)
classe = {"1A": {"Ada": 18, "Max": 12}, "1B": {"Lin": 17}}
print(classe["1A"]["Ada"])
print(sum(sum(n.values()) for n in classe.values()))
Affichage{'Ada': 18, 'Lin': 17, 'Max': 12}
{0: 0, 1: 1, 2: 4, 3: 9}
17 {'Ada': 18, 'Max': 12}
18
47
Les ensembles
Un ensemble (set) ne contient que des valeurs distinctes et n'a pas d'ordre : les doublons disparaissent, et tester x in ensemble est très rapide. Il se prête aux opérations de la théorie des ensembles : réunion |, intersection &, différence -, différence symétrique ^. Attention : {} désigne un dictionnaire vide ; un ensemble vide s'écrit set().
a = {1, 2, 3, 3, 2}
b = {3, 4}
print(sorted(a), len(a))
print(sorted(a | b), sorted(a & b), sorted(a - b), sorted(a ^ b))
a.add(10)
a.discard(1)
print(sorted(a), 2 in a)
doublons = [3, 1, 3, 2, 1]
print(sorted(set(doublons)), list(dict.fromkeys(doublons)))
print(type({}), type(set()))
Affichage[1, 2, 3] 3
[1, 2, 3, 4] [3] [1, 2] [1, 2, 4]
[2, 3, 10] True
[1, 2, 3] [3, 1, 2]
<class 'dict'> <class 'set'>
L'ordre d'affichage d'un ensemble n'est pas garanti : on le trie avec sorted quand on veut un résultat stable. Pour supprimer les doublons en gardant l'ordre d'apparition, list(dict.fromkeys(liste)) fait l'affaire.
Quelle structure pour quel besoin ?
Le choix dépend surtout de la façon dont on retrouve ses données, car les coûts diffèrent : chercher une valeur dans une liste oblige à la parcourir (O(n)), alors que chercher une clé dans un dictionnaire ou une valeur dans un ensemble est en moyenne instantané (O(1)).
| Opération | list | dict / set |
x in structure | O(n) : parcourt la liste | O(1) en moyenne |
lire liste[i] / d[cle] | O(1) | O(1) |
| ajouter à la fin / ajouter une clé | O(1) | O(1) |
| insérer ou supprimer au début | O(n) : décale les éléments | — |
Tableaux à deux dimensions
Une matrice est une liste de listes : m[i][j] est la case de la ligne i et de la colonne j. On la construit avec une compréhension pour que chaque ligne soit un objet distinct (voir matrices en 2D).
matrice = [[1, 2, 3], [4, 5, 6]]
print(matrice[1][2], len(matrice), len(matrice[0]))
transposee = [[ligne[j] for ligne in matrice] for j in range(3)]
print(transposee)
Affichage6 2 3
[[1, 4], [2, 5], [3, 6]]