Believemy logo purple

Tout savoir sur les sets en Python

Un set est une sorte de liste non ordonnée composée uniquement d'éléments uniques, très puissant pour gérer des données sans doublons.
Believemy logo

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 ! 😋

PYTHON
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 :

PYTHON
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.

PYTHON
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().

PYTHON
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.

PYTHON
animaux = {"chat", "chien", "lapin"}
# animaux[0] ERREUR !

Nous devons donc utiliser une autre manière... Une boucle serait tout à fait judicieux !

PYTHON
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().

PYTHON
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 :

  1. remove(element) : lève une erreur si l'élement n'existe pas ;
  2. discard(element) : ne fait rien si l'élément n'existe pas ;
  3. pop() : supprime un élément aléatoire (très utile dans les jeux).

Allez, prenons un exemple.

PYTHON
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().

PYTHON
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.

PYTHON
"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().

PYTHON
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 :

  1. Utiliser l'opérateur & ;
  2. Utiliser la méthode intersection().
PYTHON
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 :

  1. Utiliser l'opérateur - ;
  2. Utiliser la méthode difference().
PYTHON
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.

PYTHON
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.

PYTHON
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.

PYTHON
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.

PYTHON
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.

PYTHON
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éthodeCe qu'elle vérifieExemple
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 communFiltres exclusifs
==A et B sont strictement identiquesContrô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
"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èresetlisttuple
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 doublonsFaire des collections ordonnéesFaire 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.

PYTHON
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 :

PYTHON
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().

PYTHON
type({})        # <class 'dict'>
type(set())     # <class 'set'>

 

Utiliser des types non hashables

Seuls les types hashables peuvent être utilisés avec des sets.

HTML
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 ! 😋

PYTHON
a = {"z", "a", "b"}
print(a)  # L’ordre est arbitraire

Pour une collection ordonnée, utilisez une list, pas un set.

 

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

PYTHON
noms = ["Alice", "Bob", "Alice"]
uniques = list(set(noms))
print(uniques)  # ['Alice', 'Bob']

 

Trouver les éléments communs à deux listes

PYTHON
a = ["chat", "chien", "lapin"]
b = ["chien", "cheval"]
commun = set(a) & set(b)
print(commun)  # {'chien'}

 

Gérer des permissions

PYTHON
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 :

PYTHON
ensemble = {frozenset([1, 2]), frozenset([3, 4])}

 

Comment puis-je apprendre Python ?

Avec une bonne formation : allez voir notre formation Python par exemple.

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.