Prépa Python

Basique — chapitre 17 sur 54

Les ensembles

Collections uniques et opérations ensemblistes

60 min10 évaluations

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.

python
couleurs = {"rouge", "vert", "bleu"}
nombres = {1, 2, 3, 4, 5}

print(couleurs)
print(nombres)
print(type(couleurs))

Quatre caractéristiques :

  1. Éléments uniques : les doublons sont automatiquement supprimés.
  2. Non ordonnés : pas d'indice, l'ordre n'est pas garanti.
  3. Modifiables : on peut ajouter et retirer des éléments.
  4. Éléments immuables uniquement : comme pour les clés de dict.

Les doublons sont supprimés automatiquement

python
s = {1, 2, 2, 3, 3, 3, 4}
print(s)                 # {1, 2, 3, 4}

Pas d'indice possible

python
s = {10, 20, 30}
print(s[0])

Ensemble vide : piège !

Créer un ensemble à partir d'une autre collection

python
# 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
python
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.

python
ens = {1, 2, 3, 4, 5}
print(3 in ens)       # True
print(99 in ens)      # False

Parcourir un ensemble

Comme une liste, un ensemble se parcourt avec for :

python
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)
python
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)
python
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)
python
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 a

Diffé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)
python
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

print(a ^ b)           # {1, 2, 5, 6} — sans les éléments communs

Tableau 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 ?
python
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.

python
# À 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.

python
f = frozenset([1, 2, 3])
print(f, type(f))
python
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

quiz 01.08.q1réponse unique
Que renvoie {1, 2, 2, 3, 3, 3} ?
quiz 01.08.q2réponse unique
Que vaut type({}) ?
quiz 01.08.q3réponse unique
Que renvoie {1, 2, 3} | {3, 4, 5} ?
quiz 01.08.q4réponse unique
Que renvoie {1, 2, 3} & {2, 3, 4} ?
quiz 01.08.q5réponse unique
Que vaut len(set([1, 2, 2, 3, 3, 3])) ?
quiz 01.08.q6réponse unique
Que s'affiche-t-il ?
s = {1, 2, 3}
s.discard(99)
print(s)
quiz 01.08.q7réponse unique
Quelle est la différence principale entre set et list ?

exercice 01.08.x1à faire

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.


exercice 01.08.x2à faire

Deux classes ont leur liste d'étudiants :

python
classe_A = {"Alice", "Bob", "Charlie", "Diana", "Eve"}
classe_B = {"Charlie", "Diana", "Frank", "Grace"}

Calculez, avec des opérations ensemblistes, puis affichez :

  1. dans_les_deux — les étudiants des deux classes.
  2. seulement_a — ceux de A uniquement.
  3. seulement_b — ceux de B uniquement.
  4. exclusifs — ceux de l'une ou l'autre, mais pas des deux.
  5. 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.


exercice 01.08.x3à faire

Rangez dans lettres l'ensemble des lettres présentes dans mot (sans doublons, en minuscules).

Exemple : pour "Banana", {"b", "a", "n"}.


À retenir