ProgrammationDéveloppeur Python

Quelles sont les caractéristiques de l'utilisation du type intégré set en Python ? Comment sont organisées les opérations de base sur les ensembles, quels avantages algorithmiques offrent-elles, quels pièges peut-on rencontrer lors du travail avec des ensembles ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Les opérations d'ajout, de suppression et de recherche sont effectuées en O(1) grâce à la table de hachage.
  • Les éléments doivent être immuables (immutable) et hachables ; tenter d'ajouter une liste déclenchera une TypeError.
  • Les ensembles ne conservent pas l'ordre des éléments.

Questions piégées.

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

Erreurs typiques et anti-modèles

  • Utiliser set lorsque l'ordre des éléments est important.
  • Essayer d'ajouter un élément mutable dans un set.
  • Oublier que set ne supporte pas l'indexation (pas de s[0]).

Exemple de la vie réelle

Cas négatif

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 :

  • Efficacité en temps.
  • Unicité garantie des éléments.

Inconvénients :

  • Perte de l'ordre.
  • Les tris personnalisés sont devenus impossibles sans structures de données supplémentaires.

Cas positif

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 :

  • Minimum de code.
  • Vitesse maximale.
  • Absence de doublons dans les données.

Inconvénients :

  • L'ordre des chaînes est perdu à jamais (s'il est jamais requis ultérieurement).