Les ensembles (set en Python) sont des collections sans doublons et non ordonnées. Moins connus que les listes et dicts, ils sont pourtant extrêmement utiles pour deux cas : supprimer les doublons et faire des opérations ensemblistes (union, intersection, différence). Le TOSA les teste surtout sur ces deux usages.
Qu'est-ce qu'un ensemble ?
Un ensemble est une collection d'éléments uniques et non ordonnés. On le crée avec des accolades {} comme un dictionnaire, mais sans paires clé: valeur.
couleurs = {"rouge", "vert", "bleu"}
nombres = {1, 2, 3, 4, 5}
print(couleurs)
print(nombres)
print(type(couleurs))Quatre caractéristiques :
- Éléments uniques : les doublons sont automatiquement supprimés.
- Non ordonnés : pas d'indice, l'ordre n'est pas garanti.
- Modifiables : on peut ajouter et retirer des éléments.
- Éléments immuables uniquement : comme pour les clés de dict.
Les doublons sont supprimés automatiquement
s = {1, 2, 2, 3, 3, 3, 4}
print(s) # {1, 2, 3, 4}Pas d'indice possible
s = {10, 20, 30}
print(s[0])Ensemble vide : piège !
Créer un ensemble à partir d'une autre collection
# Depuis une liste (supprime les doublons automatiquement)
nombres = set([1, 2, 2, 3, 3, 4])
print(nombres)
# Depuis une chaîne (supprime les doublons de caractères)
lettres = set("banana")
print(lettres)Les méthodes principales
Ajouter et retirer
| Méthode | Effet |
|---|---|
add(x) |
Ajoute x (sans effet si déjà présent) |
remove(x) |
Retire x, lève KeyError si absent |
discard(x) |
Retire x, pas d'erreur si absent |
pop() |
Retire et renvoie un élément arbitraire |
clear() |
Vide l'ensemble |
s = {1, 2, 3}
s.add(4)
print(s)
s.add(2) # déjà présent : sans effet
print(s)
s.remove(1)
print(s)
s.discard(99) # pas d'erreur même si absent
print(s)Tester l'appartenance : in
Le test in est extrêmement rapide sur un set (complexité O(1)) — bien plus rapide qu'une liste.
ens = {1, 2, 3, 4, 5}
print(3 in ens) # True
print(99 in ens) # FalseParcourir un ensemble
Comme une liste, un ensemble se parcourt avec for :
couleurs = {"rouge", "vert", "bleu"}
for c in couleurs:
print(c)Attention : l'ordre de parcours n'est pas garanti pour un ensemble. Si l'ordre compte, triez d'abord : for c in sorted(couleurs).
Les opérations ensemblistes (le cœur des ensembles)
C'est ce qui fait la valeur unique des sets : effectuer des opérations mathématiques d'ensembles.
Union — tout, sans doublons
| Opérateur | Méthode équivalente |
|---|---|
a | b |
a.union(b) |
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)
print(a.union(b))Intersection — éléments communs
| Opérateur | Méthode équivalente |
|---|---|
a & b |
a.intersection(b) |
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b)
print(a.intersection(b))Différence — éléments de a qui ne sont pas dans b
| Opérateur | Méthode équivalente |
|---|---|
a - b |
a.difference(b) |
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a - b) # {1, 2} — dans a mais pas dans b
print(b - a) # {5, 6} — dans b mais pas dans aDifférence symétrique — éléments dans l'un OU l'autre, mais pas les deux
| Opérateur | Méthode équivalente |
|---|---|
a ^ b |
a.symmetric_difference(b) |
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a ^ b) # {1, 2, 5, 6} — sans les éléments communsTableau récapitulatif
| Opération | Opérateur | Méthode | Résultat |
|---|---|---|---|
| Union | a | b |
a.union(b) |
Tout |
| Intersection | a & b |
a.intersection(b) |
Ce qui est commun |
| Différence | a - b |
a.difference(b) |
Dans a uniquement |
| Diff. symétrique | a ^ b |
a.symmetric_difference(b) |
Pas en commun |
Tests ensemblistes
| Méthode | Effet |
|---|---|
a.issubset(b) ou a <= b |
a est-il inclus dans b ? |
a.issuperset(b) ou a >= b |
a contient-il b ? |
a.isdisjoint(b) |
a et b n'ont aucun élément commun ? |
a = {1, 2}
b = {1, 2, 3, 4}
c = {10, 20}
print(a.issubset(b)) # True
print(b.issuperset(a)) # True
print(a.isdisjoint(c)) # True
print(a.isdisjoint(b)) # False (ils partagent 1 et 2)Cas d'usage typique : supprimer les doublons
L'usage #1 des sets dans du code Python réel.
# À partir d'une liste avec doublons
notes = [12, 15, 12, 9, 15, 17, 12, 9]
notes_uniques = set(notes)
print(notes_uniques)
# Si on veut RÉCUPÉRER une liste sans doublons
liste_sans_doublons = list(set(notes))
print(liste_sans_doublons)Les frozenset : ensembles immuables
Python propose un type frozenset : un set immuable, comme un tuple est une liste immuable. On l'utilise rarement au niveau Basique, mais il est bon de savoir qu'il existe.
f = frozenset([1, 2, 3])
print(f, type(f))f.add(4) # ❌ impossible, immuableÀ la différence d'un set classique, un frozenset peut servir de clé de dictionnaire ou d'élément dans un autre set.
Vue synthétique : les 4 structures de données de base
Tableau essentiel pour le TOSA — à connaître par cœur :
| Caractéristique | list |
tuple |
dict |
set |
|---|---|---|---|---|
| Syntaxe | [1, 2] |
(1, 2) |
{"a": 1} |
{1, 2} |
| Ordonné | ✅ | ✅ | ✅ (3.7+) | ❌ |
| Modifiable | ✅ | ❌ | ✅ | ✅ |
| Indexable | ✅ | ✅ | ❌ (par clé) | ❌ |
| Doublons autorisés | ✅ | ✅ | ❌ (clés) | ❌ |
| Accès | l[i] |
t[i] |
d[k] |
x in s |
Test in complexité |
O(n) | O(n) | O(1) | O(1) |
| Principaux usages | Collection générique | Données immuables | Données structurées | Unicité, ensembles |
Exercices
{1, 2, 2, 3, 3, 3} ?
type({}) ?
{1, 2, 3} | {3, 4, 5} ?
{1, 2, 3} & {2, 3, 4} ?
len(set([1, 2, 2, 3, 3, 3])) ?
s = {1, 2, 3}
s.discard(99)
print(s)
set et list ?
Soit la liste fruits = ["pomme", "banane", "pomme", "cerise", "banane", "kiwi"].
Créez une liste fruits_uniques contenant chaque fruit une seule fois, rangés par ordre alphabétique.
Indice : un ensemble élimine les doublons, et sorted() en fait une liste triée.
Deux classes ont leur liste d'étudiants :
classe_A = {"Alice", "Bob", "Charlie", "Diana", "Eve"}
classe_B = {"Charlie", "Diana", "Frank", "Grace"}Calculez, avec des opérations ensemblistes, puis affichez :
dans_les_deux— les étudiants des deux classes.seulement_a— ceux de A uniquement.seulement_b— ceux de B uniquement.exclusifs— ceux de l'une ou l'autre, mais pas des deux.total— le nombre d'étudiants distincts.
Les quatre premières sont des listes triées : sorted(...). Un ensemble
n'a pas d'ordre, et sa représentation change d'une exécution à l'autre —
trier est ce qui rend le résultat comparable.
Rangez dans lettres l'ensemble des lettres présentes dans mot (sans doublons, en minuscules).
Exemple : pour "Banana", {"b", "a", "n"}.