ProgrammationDéveloppeur Backend

Expliquez les spécificités du type intégré set en Python. Comment fonctionnent les principales opérations sur les ensembles, quels avantages algorithmiques offrent-elles, et quels pièges peuvent exister lors de l'utilisation des ensembles?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Historique de la question : Le type set (ensemble) a été ajouté dans Python 2.4 et fournit un moyen pratique et rapide de stocker des éléments uniques et immuables, avec le support d'opérations théoriques sur les ensembles (union, intersection, etc.). Les ensembles sont implémentés sur la base de tables de hachage.

Problème : Beaucoup d'utilisateurs n'ont pas de compréhension de la différence entre set et list, des spécificités de stockage des éléments dans un set (désordre, seulement des objets hashables), ainsi que des nuances d'utilisation des ensembles pour optimiser la recherche, vérifier l'unicité ou travailler avec de grands ensembles de données.

Solution : Set — un conteneur mutable et non ordonné d'objets uniques et hashables. Il prend en charge des opérations rapides de recherche d'appartenance, d'union, d'intersection, de différence et de différence symétrique. Méthodes intégrées : add, remove, discard, update, intersection, difference, union, symmetric_difference, et d'autres.

Exemple de code :

nums = {1, 3, 5, 7} nums.add(9) nums.update([5, 10]) # 5 est déjà présent, seul 10 sera ajouté other = {3, 9, 11} inter = nums & other # intersection {3, 9} # Vérification d'appartenance — plus rapide qu'avec list y = 11 if y in nums: print('Présent!')

Caractéristiques clés :

  • Les éléments doivent être hashables, sinon une erreur TypeError se produira.
  • L'opération in est incroyablement rapide (O(1) en moyenne), contrairement à la liste (O(n)).
  • Ne conserve pas l'ordre, bien qu'avec Python 3.7, l'ordre d'ajout des éléments soit implicitement conservé (mais cela ne peut pas être compté pour les algorithmes).

Questions piégeantes.

Peut-on ajouter une liste ou un autre set dans un set ?

Réponse : Non, impossible. Seuls les objets hashables (immuables) sont autorisés : chaînes, nombres, tuples. Les listes et les ensembles — sont mutables, il est donc impossible de les ajouter.

Exemple de code :

s = set() s.add([1, 2]) # TypeError: type 'list' non hashable s.add((1, 2)) # OK

Quelle est la différence entre la méthode remove et discard d'un set ?

Réponse : remove(value) génère une exception KeyError si la valeur n'est pas trouvée. discard(value) ne fait rien en silence si cet élément n'existe pas.

Exemple de code :

s = {1, 2, 3} s.remove(4) # KeyError s.discard(4) # Pas d'erreur

Un ensemble vide {} est-il un objet set ?

Réponse : Non. Le littéral {} est toujours un dict vide. Pour créer un set vide, il faut utiliser la fonction set().

Exemple de code :

empty_set = {} # Ceci est un dict empty_set_real = set() # Ceci est un set

Erreurs typiques et anti-patterns

  • Confondent les littéraux : {} pensent que c'est un set, mais c'est un dict.
  • Tentent d'ajouter des objets mutables.
  • Attend l'ordre des éléments.
  • Utilise remove au lieu de discard, sans gérer KeyError.

Exemple de la vie réelle

Cas négatif

Tentent de stocker des objets uniques dans une liste et de faire des vérifications via "in" pour rechercher des doublons lors de gros volumes de données.

Avantages :

  • Syntaxe simple.

Inconvénients :

  • Très lent (O(n)). Un ensemble aurait résolu cette tâche instantanément.

Cas positif

Utilisent un set pour rechercher des intersections et des données uniques dans de grands tableaux (par exemple, des envois d'e-mails), sans que des doublons se produisent et avec une opération rapide.

Avantages :

  • Recherche maximalement efficace, code compact, prévention des doublons au niveau de la structure de données.

Inconvénients :

  • Doit retenir la contrainte de hachabilité et le désordre des éléments.