Historique de la question :
Les ensembles (set) ont été introduits dans Python comme un type intégré distinct à partir de Python 2.4 (avant cela, ils étaient implémentés comme un module tiers). Ils permettent de stocker efficacement des éléments uniques et désordonnés et supportent de nombreuses opérations standards de la théorie des ensembles : union, intersection, différence, différence symétrique et vérification des sous-ensembles.
Problème :
Sans set, il faut utiliser des listes, ce qui entraîne une recherche inefficace des éléments uniques, ralentissant ainsi les algorithmes utilisant un grand nombre de vérifications d'appartenance. Le set est implémenté via une table de hachage, donc toutes les opérations de recherche, d'ajout et de suppression sont réalisées en temps amorti O(1). Cependant, cette structure peut poser des problèmes inattendus — par exemple, la perte de l'ordre des éléments, des limitations sur les types d'éléments (ils doivent être immuables et hachables), et une mauvaise compréhension des caractéristiques de comparaison des ensembles et de leur interaction avec d'autres structures.
Solution :
Utiliser set lorsque vous devez uniquement stocker des éléments uniques et effectuer des opérations sur eux tirées de la théorie des ensembles. Il est important de se rappeler que les éléments doivent être hachables (par exemple, des nombres, des chaînes, des tuple, mais pas des listes ou des dict). Un ensemble riche de méthodes intégrées est mis à disposition pour travailler avec set (add, remove, union, intersection, difference, issubset, etc.).
Exemple de code :
s1 = {1, 2, 3, 4} s2 = {3, 4, 5} print(s1 | s2) # {1, 2, 3, 4, 5} (union) print(s1 & s2) # {3, 4} (intersection) print(s1 - s2) # {1, 2} (différence) print(3 in s1) # True (vérification d'appartenance)
Caractéristiques clés :
Peut-on ajouter des types mutables (comme des listes) dans un set ?
Non, les éléments d'un ensemble doivent être hachables et immuables. Une liste ou un dict ne peut pas être ajouté à un set, Python lèvera une TypeError.
s = set() s.add([1, 2, 3]) # TypeError : type 'list' non hachable
Un set conserve-t-il l'ordre des éléments ?
Non. Depuis la création d'un set, les éléments ne sont pas garantis d'être retournés dans l'ordre dans lequel ils ont été ajoutés, surtout lorsqu'on modifie la taille de l'ensemble.
s = {5, 2, 8, 1} print(s) # L'ordre n'est pas défini
Quelle est la différence entre set et frozenset et peut-on utiliser frozenset comme élément d'un set ?
frozenset est une version immuable de set. Il peut être utilisé comme un élément d'un autre set ou comme clé d'un dict, car il est hachable.
fs = frozenset([1, 2, 3]) s = set() s.add(fs) # OK
Un développeur a voulu stocker des éléments uniques et a choisi set, sans tenir compte de l'ordre de leur apparition. En conséquence, une partie de la logique métier, dépendant de l'ordre de traitement, a cessé de fonctionner.
Avantages :
Inconvénients :
Dans une tâche de filtrage rapide d'enregistrements uniques à partir d'un grand ensemble, set a été choisi car seul le fait d'unicité était important, et non l'ordre. La performance a considérablement augmenté, le code a été simplifié.
Avantages :
Inconvénients :