Tout savoir sur les sets en Python
En Python, un set est une collection non ordonnée d’éléments uniques.
Inspiré des ensembles mathématiques, c’est un outil extrêmement puissant pour gérer des données sans doublons, faire des comparaisons rapides ou encore filtrer efficacement.
Quelques usages typiques :
- Supprimer les doublons dans une liste ;
- Vérifier si deux listes ont des éléments en commun ;
- Gérer des groupes, tags, autorisations, etc.
Pensez à un set comme un sac d’objets où chaque objet apparaît une seule fois, peu importe combien de fois vous l’y mettez.
Qu'est-ce qu'un set en Python ?
Pour faire court, un set est :
- Non ordonnée : les éléments ne suivent pas de position précise ;
- Mutable : on peut ajouter / retirer des éléments sans problème ;
- Composé uniquement d'objets immuables : par exemple, des nombres, chaînes de caractères, tuples, mais pas des listes ou d'autres sets.
Allez, prenons un exemple pour illustrer tout ça ! 😋
mon_set = {1, 2, 3, 4}
print(mon_set) # {1, 2, 3, 4}
Si nous appliquons un doublon, il sera automatiquement supprimé pour ne garder qu'un seul élément :
mon_set = {1, 2, 2, 3}
print(mon_set) # {1, 2, 3}
Python élimine automatiquement les répétitions.
Attention : les sets ne garantissent aucun ordre d’affichage. Le même set peut apparaître différemment d’un appel à l’autre.
Créer un set
Il existe plusieurs manières pour créer un set en Python.
Avec des accolades
La première façon de créer un set en Python est d'utiliser les accolades.
animaux = {"chat", "chien", "oiseau"}
Facile, non ? 👀
Avec la fonction set()
Il est également possible d'utiliser une fonction dédiée pour créer des sets : set()
.
fruits = set(["pomme", "banane", "pomme"])
print(fruits) # {'pomme', 'banane'}
Attention cependant quand vous créez des set vides ! Car vous devrez obligatoirement utiliser la fonction
set()
.PYTHON# Mauvais : crée un dictionnaire vide a = {} # Bon : crée un set vide a = set()
Accéder aux éléments d'un set
Les sets ont cette particularité de ne pas être indexés : on ne peut pas accéder directement à un élément par sa position comme avec une liste.
animaux = {"chat", "chien", "lapin"}
# animaux[0] ERREUR !
Nous devons donc utiliser une autre manière... Une boucle serait tout à fait judicieux !
for animal in animaux:
print(animal)
Même si l’ordre d’apparition est imprévisible, chaque élément sera bien parcouru une seule fois.
Ajouter et supprimer des éléments
Ajouter un élément avec add()
Il est possible d'ajouter un élément à notre set en utilisant la méthode dédiée à cette instruction : add()
.
animaux = {"chat", "chien"}
animaux.add("oiseau")
print(animaux) # {'chat', 'chien', 'oiseau'}
Supprimer un élément
Pour supprimer un élément, nous avons un peu plus de choix :
remove(element)
: lève une erreur si l'élement n'existe pas ;discard(element)
: ne fait rien si l'élément n'existe pas ;pop()
: supprime un élément aléatoire (très utile dans les jeux).
Allez, prenons un exemple.
animaux.remove("chien")
animaux.discard("chat")
supprimé = animaux.pop()
Préférez
discard()
si vous n’êtes pas sûr que l’élément existe, pour éviter des erreurs. 😉
Vider complètement un set
Nous pouvons aussi décider de vider un set grâce à la méthode clear()
.
animaux.clear()
Vérifier la présence d'un élément dans un set
Bien souvent nous avons envie de vérifier qu'un élément est présent dans notre set.
Pour ce faire, nous pouvons utiliser le mot-clé in
. Son object est de retourner true
ou false
selon que l'élément à gauche est dans le set à droite.
"chien" in {"chien", "chat"} # ✅ True
"lapin" in {"chien", "chat"} # ❌ False
Les opérations sur les sets
Les sets permettent d’effectuer directement des opérations mathématiques d’ensembles.
Union (avec "|" ou "union()")
Une union permet de réunir tous les éléments du set A
et du set B
.
Pour ce faire, nous pouvons utiliser à la fois le pipe (|
) ou la méthode union()
.
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b) # {1, 2, 3, 4, 5}
print(a.union(b)) # idem
Intersection (avec "&" ou "intersection()")
Comme avec les unions, il est possible de faire des intersections pour afficher seulement les éléments présents à la fois dans A
et dans le set B
.
Deux possibilités aussi :
- Utiliser l'opérateur
&
; - Utiliser la méthode
intersection()
.
a = {1, 2, 3}
b = {3, 4, 5}
print(a & b) # {3}
print(a.intersection(b)) # idem
Différence (avec "-" ou "difference()")
À l'inverse d'une intersection, une différence permet d'afficher / utiliser seulement les éléments qui ne sont ni dans A
ni dans le set B
.
Idem, deux possibilités :
- Utiliser l'opérateur
-
; - Utiliser la méthode
difference()
.
a = {1, 2, 3}
b = {3, 4, 5}
print(a - b) # {1, 2}
print(a.difference(b)) # idem
Différence symétrique (avec "^" ou "symmetric_difference()")
Enfin nous pouvons calculer une différence symétrique grâce à l'opérateur ^
ou à la méthode symmetric_difference()
.
Une différence symétrique n'est rien d'autre qu'un moyen de récupérer les éléments présents dans A
et les éléments présents dans le set B
mais pas dans les deux simultanément.
a = {1, 2, 3}
b = {3, 4, 5}
print(a ^ b) # {1, 2, 4, 5}
print(a.symmetric_difference(b)) # idem
Ces opérations sont rapides et lisibles, parfaites pour filtrer, fusionner ou exclure des données.
Comparer des ensembles de sets
Il est possible d'utiliser les sets en Python pour effectuer quelques comparaisons.
Comparer des ensembles permet de savoir comment deux sets se situent l’un par rapport à l’autre : est-ce qu’ils ont les mêmes éléments ? Est-ce que l’un contient l’autre ? Est-ce qu’ils sont totalement distincts ?
Pour ce faire, nous pouvons utiliser plusieurs méthodes que nous allons voir ensemble.
issubset() : sous-ensemble
Vérifie si tous les éléments du set courant sont aussi dans un autre set.
a = {1, 2}
b = {1, 2, 3}
print(a.issubset(b)) # ✅ True
print(b.issubset(a)) # ❌ False
On peut imaginer par exemple une vérification sur des permissions minimales requises pour un utilisateur.
issuperset() : sur-ensemble
Vérifie si le set courant contient tous les éléments d’un autre set.
a = {1, 2}
b = {1, 2, 3}
print(b.issuperset(a)) # ✅ True
print(a.issuperset(b)) # ❌ False
isdisjoint() : aucun élément en commun
Renvoie True
si les deux ensembles sont totalement distincts.
x = {"chat", "chien"}
y = {"pomme", "banane"}
print(x.isdisjoint(y)) # ✅ True
Faire une comparaison d'égalité ("==")
Enfin, deux sets sont égaux s’ils contiennent exactement les mêmes éléments, peu importe l’ordre.
a = {1, 2, 3}
b = {3, 1, 2}
print(a == b) # ✅ True
Tabeau récapitulatif
Faison un petit récap des méthodes que nous avons vu ensemble pour comparer des sets en Python.
Méthode | Ce qu'elle vérifie | Exemple |
issubset() | Est-ce que A est contenu dans B ? | Autorisations |
issuperset() | Est-ce que A contient tous les éléments de B ? | Groupes d'autorisations |
isdisjoint() | A et B n'ont aucun élément en commun | Filtres exclusifs |
== | A et B sont strictement identiques | Contrôler des égalités |
Les sets et la performance
Les sets sont extrêmement performants pour certaines opérations, en particulier les tests d’appartenance (in
) et les suppressions.
Vous vous souvenez ? Nous en avons parlé juste avant. 😋
"Python" in ["Python", "Java", "C"] # ✅ Liste : O(n)
"Python" in {"Python", "Java", "C"} # ✅ Set : O(1) en moyenne
Les sets utilisent un système de hachage, ce qui permet une recherche quasiment instantanée, même avec de grandes quantités de données.
Évitez juste d'utiliser un set si vous avez besoin de préserver l'ordre.
Set vs List vs Tuple : comparaison
Les sets sont souvent comparés aux listes ou aux tuples. Faisons un point ensemble sur leurs différences.
Critère | set | list | tuple |
Ordonné ? | ❌ Non | ✅ Oui | ✅ Oui |
Éléments uniques ? | ✅ Oui | ❌ Non | ❌ Non |
Modifiable ? | ✅ Oui | ✅ Oui | ❌ Non |
Rapide pour in ? | ✅ Oui | ❌ Non | ❌ Non |
Indexable ? | ❌ Non | ✅ Oui | ✅ Oui |
Utilisation typique | Éliminer des doublons | Faire des collections ordonnées | Faire des collections immuables |
Si vous avez besoin d’unicité, de rapidité, et pas d’ordre, un set est souvent le meilleur choix.
Les frozensets
Un frozenset
est simplement une version immutable de set
. Une fois créé, on ne peut plus y ajouter ni supprimer d’éléments.
fs = frozenset(["pomme", "poire"])
On l'utilise pour garantir l'intégrité d'un ensemble.
Si vous avez besoin d’un ensemble constant, le frozenset
est l’équivalent d’un tuple
pour les sets.
Ceci n'est donc pas possible :
fs = frozenset(["pomme", "poire"])
fs.add("choux") # AttributeError: `frozenset` object has no attribute 'add'
Les erreurs fréquentes avec les sets
Voyons ensemble les pièges courants à éviter avec les sets quand on débute.
Croire que {} crée un set
Nous l'avons vu ensemble ! Si vous déclarez {}
ceci créera un dictionnaire vide, pas un set. Il faut utiliser set()
.
type({}) # <class 'dict'>
type(set()) # <class 'set'>
Utiliser des types non hashables
Seuls les types hashables peuvent être utilisés avec des sets.
set([[1, 2], [3, 4]]) # ❌ Erreur : les listes ne sont pas hashables
set([(1, 2), (3, 4)]) # ✅ OK
Pour rappel, un objet hashable est un objet :
- Dont la valeur ne change pas dans le temps ;
- Qui possède une fonction
__hash__()
fiable ; - Qui peut être comparé (
__eq__()
).
Ces types sont par exemples hashables : int
, float
, str
, bool
et tuple
.
Mais pas ces derniers : list
, dict
, set
(car ils peuvent changer).
Penser que les sets sont tous ordonnés
Encore quelque chose que nous avons vu ensemble ! 😋
a = {"z", "a", "b"}
print(a) # L’ordre est arbitraire
Pour une collection ordonnée, utilisez une
list
, pas unset
.
Cas pratiques réels
Voici quelques cas pratiques dans des situations réelles pour bien comprendre à quoi peuvent servir les sets.
Supprimer des doublons d'une liste
noms = ["Alice", "Bob", "Alice"]
uniques = list(set(noms))
print(uniques) # ['Alice', 'Bob']
Trouver les éléments communs à deux listes
a = ["chat", "chien", "lapin"]
b = ["chien", "cheval"]
commun = set(a) & set(b)
print(commun) # {'chien'}
Gérer des permissions
permissions_user = {"read", "write"}
permissions_requises = {"read"}
if permissions_requises.issubset(permissions_user):
print("Accès autorisé")
Les sets sont idéaux pour les cas où l’unicité et la logique d’inclusion sont essentielles.
Questions fréquentes sur les sets
Quand on débute avec les sets c'est assez courant de se poser des questions ! Voici nos réponses.
Quelle est la différence entre un
set
et un dictionnaire ?
Un set contient uniquement des valeurs uniques, alors qu’un dict
est une association clé/valeur.
Peut-on avoir des sets dans un set ?
Non, car les set sont non-hashables (on l'a vu ensemble). Utilisez frozenset
à la place :
ensemble = {frozenset([1, 2]), frozenset([3, 4])}
Comment puis-je apprendre Python ?
Avec une bonne formation : allez voir notre formation Python par exemple.