HOWTO · Python

Comment joindre deux ensembles en Python

Cet article explique comment joindre deux ensembles en Python.

Sur cette page

En Python, les ensembles stockent des éléments uniques : joindre deux ensembles revient donc à calculer leur union, c’est-à-dire une collection contenant chaque élément présent dans l’un ou l’autre, les doublons étant réduits à un seul exemplaire. Vous pouvez le faire avec l’opérateur |, la méthode union() ou les formes de modification sur place update() et |=, selon que vous souhaitez obtenir un nouvel ensemble ou modifier un ensemble existant.

Combiner des ensembles avec l’opérateur d’union (|)

L’opérateur d’union | prend deux ensembles et retourne un nouvel ensemble contenant chaque élément présent dans l’un ou l’autre. Les ensembles d’origine ne sont pas modifiés.

Le code ainsi que les libellés et sorties affichés dans cette section restent en anglais.

set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}

result_set = set1 | set2
print(result_set)
print(set1)
print(set2)

Sortie :

{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4}
{3, 4, 5, 6}

Les valeurs communes 3 et 4 n’apparaissent qu’une seule fois dans result_set, et set1 et set2 conservent leurs éléments d’origine. Les deux opérandes de | doivent être de type ensemble (set ou frozenset) ; combiner un ensemble avec une liste au moyen de | provoque une erreur TypeError, il faut donc d’abord convertir la liste avec set().

Ajouter des éléments sur place avec update() ou |=

Lorsque vous voulez qu’un ensemble existant absorbe les éléments d’une autre collection plutôt que de construire un nouvel ensemble, utilisez la méthode update() ou l’assignation augmentée |=. Toutes deux modifient l’ensemble situé à gauche au lieu de retourner un nouvel ensemble.

Les deux formes diffèrent par ce qu’elles acceptent. update() prend n’importe quel itérable — un ensemble, une liste, un tuple ou une chaîne — tandis que |= exige un opérande droit de type ensemble, avec les mêmes restrictions que |.

Le code ainsi que les libellés et sorties affichés dans cette section restent en anglais.

numbers = {1, 2, 3}

numbers.update([3, 4, 5])
print(numbers)

numbers |= {6, 7}
print(numbers)

Sortie :

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5, 6, 7}

L’appel à update() ajoute directement les nouvelles valeurs de la liste à numbers, puis |= fusionne le second ensemble dans le même objet. N’utilisez ces formes que lorsque la modification sur place est voulue, car toute autre référence à cet ensemble voit également le changement.

Utiliser union() pour combiner plusieurs ensembles ou itérables

La méthode union() est l’équivalent sous forme de méthode de |. Elle retourne un nouvel ensemble et laisse ses entrées inchangées, mais contrairement à l’opérateur, elle accepte un nombre quelconque d’arguments, et chacun peut être n’importe quel itérable, pas seulement un ensemble.

Le code ainsi que les libellés et sorties affichés dans cette section restent en anglais.

set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}

result_set = set1.union(set2, {7, 8}, [9, 10])
print(result_set)
print(set1)

Sortie :

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{1, 2, 3, 4}

Ici, union() fusionne un ensemble, un littéral d’ensemble et une liste en un seul appel, tandis que set1 conserve ses éléments d’origine. Lorsque tous les opérandes sont déjà des ensembles, a.union(b) produit le même résultat que a | b.

Choisir l’opération selon que vous avez besoin d’un nouvel ensemble

Choisissez la forme en fonction du résultat souhaité :

  • Vous avez besoin d’un nouvel ensemble et voulez préserver les originaux : utilisez | lorsque les deux opérandes sont des ensembles, ou union() lorsqu’un opérande est une liste ou un autre itérable, ou pour combiner trois collections ou plus.
  • Vous voulez modifier un ensemble existant : utilisez update() pour n’importe quel itérable, ou |= pour des opérandes de type ensemble.
  • Vous lisez du code existant : a.union(b) et a | b signifient la même chose pour des ensembles, et a.update(b) et a |= b sont leurs équivalents de modification sur place.

Dans la plupart des cas, result = set1 | set2 est la réponse directe pour joindre deux ensembles ; utilisez union() lorsque les opérandes peuvent ne pas être des ensembles, et update() ou |= uniquement lorsque la modification sur place est l’objectif.