Tout savoir sur les frozenset en Python
Un frozenset
est une variante immuable du type set
en Python.
Cela signifie qu’une fois créé, on ne peut plus le modifier : il est impossible d’y ajouter ou retirer des éléments.
En bref : un
frozenset
est unset
"gelé" (frozen 🇺🇸) ! Parfait pour garantir l'intégrité d’un ensemble de valeurs.
Concrètement, on peut imaginer utiliser un frozenset dans ces scénarios :
- Pour protéger un ensemble de données contre toute modification accidentelle ;
- Pour utiliser un ensemble comme clé dans un dictionnaire, ce que
set
ne permet pas ; - Pour bénéficier d’un type hashable, pratique dans les contextes avancés.
Différences entre set et frozenset
Tableau comparatif
Voici les principales différences entre un set
et un frozenset
:
Caractéristique | set | frozenset |
Modifiable ? | ✅ Oui | ❌ Non |
Hashable ? | ❌ Non | ✅ Oui |
Propose une clé de dictionnaire ? | ❌ Non | ✅ Oui |
Ajout / suppression ? | ✅ Oui (add, remove, pop, etc) | ❌ Non |
Exemple comparatif
D'un point de vue code, voici ce que ça donne :
# Set
s = {1, 2, 3}
s.add(4) # ✅ OK
# Frozenset
fs = frozenset([1, 2, 3])
fs.add(4) # ❌ Erreur : 'frozenset' object has no attribute 'add'
Utiliser frozenset
permet bien d’éviter des modifications involontaires du jeu de données, en particulier dans les projets complexes où plusieurs fonctions partagent un même objet. 😉
Créer un frozenset
Le mot-clé pour créer un ensemble immuable est simplement : frozenset()
. Facile ! 🥸
# Depuis une liste
fs1 = frozenset([1, 2, 3])
# Depuis un set
s = {4, 5}
fs2 = frozenset(s)
# Depuis une string
fs3 = frozenset("abc") # {'a', 'b', 'c'}
Un
frozenset
élimine aussi les doublons, comme unset
classique.PYTHONfs = frozenset([1, 2, 2, 3]) print(fs) # frozenset({1, 2, 3})
Les opérations sur un frozenset
Même si un frozenset
est immuable, il accepte toutes les opérations ensemblistes classiques.
Union (avec "|")
Une union permet de réunir tous les éléments d'un frozenset A
et d'un second frozenset B
.
a = frozenset([1, 2])
b = frozenset([2, 3])
print(a | b) # frozenset({1, 2, 3})
Notons que le "2" a été supprimé car il était en double : nous n'en avons gardé qu'un seul, grâce à l'unicité propre aux sets (donc aux frozensets).
Intersection (avec "&")
Une intersection permet de récupérer uniquement les éléments qui sont à la fois dans le frozenset A
et dans le frozenset B
.
a = frozenset([1, 2])
b = frozenset([2, 3])
print(a & b) # frozenset({2})
Différence (avec "-")
Une différence donne les éléments qui sont dans le frozesent A
et pas dans le frozenset B
.
a = frozenset([1, 2])
b = frozenset([2, 3])
print(a - b) # frozenset({1})
Différence symétrique (avec "^")
Une différence symétrique donne les éléments dans le frozensent A
qui ne sont pas dans le frozenset B
et inversement (contrairement à une simple différence).
a = frozenset([1, 2])
b = frozenset([2, 3])
print(a ^ b) # frozenset({1, 3})
Le frozenset comme clé dans un dictionnaire
L’une des principales raisons d’utiliser un frozenset
, c’est qu’il est hashable, ce qui permet de l’utiliser comme clé dans un dictionnaire (chose impossible avec un set
classique).
permissions = {
frozenset(['read', 'write']): 'Utilisateur standard',
frozenset(['read', 'write', 'delete']): 'Administrateur'
}
print(permissions[frozenset(['read', 'write'])]) # Utilisateur standard
Grâce à cette propriété, le frozenset
devient très utile dans les cas où vous souhaitez associer des ensembles de permissions, de tags ou de propriétés à une valeur spécifique.
Utilisation dans des ensembles de sets
Puisqu’un set
ne peut contenir que des objets hashables, il ne peut pas contenir un autre set
. En revanche, il peut parfaitement contenir un frozenset
.
a = frozenset([1, 2])
b = frozenset([2, 3])
ensemble_de_sets = {a, b}
print(ensemble_de_sets)
Tout ceci ouvre la porte à des cas d’usage avancés :
- Comparaison de grappes de données (clustering) ;
- Analyse de graphes ou de réseaux ;
- Validation de configurations immuables.
Si vous avez besoin d’un ensemble d’ensembles,
frozenset
est votre seul allié en Python natif.
Le typage avec frozenset
Python propose une annotation de type spécifique pour frozenset
via le module typing
.
from typing import FrozenSet
def traiter_permissions(permissions: FrozenSet[str]) -> None:
print("Permissions reçues :", permissions)
Ce typage permet de mieux documenter votre code tout en le rendant compatible avec des outils de vérification statique comme mypy
ou pyright
.
Comparaison entre frozenset et tuple
Une autre comparaison assez souvente faite avec frozenset
est avec tuple
.
Critère | frozenset | tuple |
Ordonné ? | ❌ Non | ✅ Oui |
Doublons autorisés ? | ❌ Non | ✅ Oui |
Accès par index ? | ❌ Non | ✅ Oui |
Opérations ensemblistes ? | ✅ Oui | ❌ Non |
De manière générale, tuple
est plus adapté pour des données positionnelles, tandis que frozenset
est idéal pour des ensembles de propriétés uniques.
Questions fréquentes sur frozenset
Peut-on trier un
frozenset
?
Non, mais on peut le convertir :
trie = sorted(frozenset([3, 1, 2])) # [1, 2, 3]
Pourquoi ne pas toujours utiliser
frozenset
?
Parce qu’il est moins flexible. Si vous devez modifier l’ensemble, préférez set
.
Comment apprendre Python ?
Avec une super formation Python ! 👀