4.6. Les ensembles

Les ensembles (« sets » en anglais) en Python sont des structures de données à mi-chemin entre les listes et les dictionnaires. Il s’agit de listes non ordonnées et dont chaque valeur est unique, un peu comme des dictionnaires dont les clés ne sont associées à aucune valeur.

Les ensembles sont particulièrement utiles si l’on cherche à regrouper plusieurs valeurs dont on aimerait par la suite vérifier la présence ou l’absence, ou pour effectuer des opérations ensemblistes comme l’union, l’intersection ou la différence.

4.6.1. Déclaration d’un ensemble

On crée un ensemble grâce aux accolades ({, }), les valeurs étant séparées par des virgules.

set1 = {0, 2, 4, 6, 8}
set2 = {"zéro", 2, 4.0, 6, 8, True}
empty_dict = {}     # des accolades sans valeurs créent un dictionnaire vide !
empty_set = set()   # on crée un ensemble vide avec la fonction `set()`
set3 = {1, 3, 3, 7} # équivalent à {7, 3, 1} (ordre et doublons ignorés)

Tout comme les clés de dictionnaires, les valeurs des ensembles doivent être immuables. Il est donc impossible, par exemple, d’y stocker des listes dont les éléments pourraient être modifiés. Les tuples, quant à eux, sont immuables et peuvent donc être ajoutés dans les ensembles.

>>> valid_set = {0, (2, 4), 6, 8}
>>> invalid_set = {0, [2, 4], 6, 8}
Traceback (most recent call last):
  File "<input>", line...
TypeError: unhashable type: 'list'

4.6.2. Modifier le contenu d’un ensemble

On ajoute des éléments à un ensemble grâce à la fonction add() et on en supprime grâce à discard(), en spécifiant l’élément concerné en paramètre.

my_set = {0, 2, 4, 6, 7}

my_set.add(8)
print(my_set)

my_set.discard(7)
print(my_set)
{0, 2, 4, 6, 7, 8}
{0, 2, 4, 6, 8}

4.6.3. Les opérations entre ensembles

Les ensembles peuvent être combinés à l’aide des 4 opérateurs ensemblistes communs : union, intersection, différence et différence symétrique.

Opérations ensemblistes

Opérateur

Fonction

|

union

&

intersection

-

différence

^

différence symétrique

La figure 4.5 ci-dessous résume le principe des différents opérateurs ensemblistes, qui seront décrits plus en détail par la suite. Les deux ensembles a et b comprennent tous deux 3 valeurs entières avec un seul élément en commun (le nombre 3). Les 4 opérations ensemblistes (union, intersection, différence et différence symétrique) appliquées à a et b produisent comme résultat de nouveaux ensembles qui, dans cet exemple, sont tous différents.

Opérations ensemblistes

Fig. 4.5 Opérations ensemblistes.

L’union

L’opération d’union consiste à combiner deux ensembles en un seul qui contiendra toutes les valeurs présentes dans les deux ensembles initiaux (sans les doublons).

a = {0, 2, 4, 6, 8}
b = {0, 1, 2, 3, 4, 5}

print(a | b)  # opération symétrique : (a | b) == (b | a)
{0, 1, 2, 3, 4, 5, 6, 8}

L’intersection

L’opération d’intersection ne conserve dans l’ensemble combiné que les valeurs présentes dans chacun des deux ensembles initiaux.

a = {0, 2, 4, 6, 8}
b = {0, 1, 2, 3, 4, 5}

print(a & b)  # opération symétrique : (a & b) == (b & a)
{0, 2, 4}

La différence

L’opération de différence conserve dans l’ensemble combiné toutes les valeurs du premier ensemble initial hormis celles qui sont aussi présentes dans le second.

a = {0, 2, 4, 6, 8}
b = {0, 1, 2, 3, 4, 5}

print(a - b)  # opération non symétrique : (a - b) != (b - a)
print(b - a)
{8, 6}
{1, 3, 5}

La différence symétrique

L’opération de différence symétrique a le même effet que l’opération d’union, à l’exception des valeurs présentes dans les deux ensembles initiaux qui sont exclues de l’ensemble combiné.

a = {0, 2, 4, 6, 8}
b = {0, 1, 2, 3, 4, 5}

print(a ^ b)  # opération symétrique : (a ^ b) == (b ^ a).
{1, 3, 5, 6, 8}

On remarque qu’il s’agit de l’union des différences entre les deux ensembles initiaux.

a = {0, 2, 4, 6, 8}
b = {0, 1, 2, 3, 4, 5}

print((a - b) | (b - a))
print((a - b) | (b - a) == a ^ b)
{1, 3, 5, 6, 8}
True

4.6.4. Itération et test d’appartenance

L’itération et les tests d’appartenance sur les ensembles s’effectuent de la même manière que sur les listes.

sentence = set("Bonjour le monde !")  # chaque caractère est ajouté individuellement

print(sentence)

for letter in sentence:  # pour chaque lettre contenue dans l'ensemble...
    print(letter)        # on affiche cette lettre (notez l'ordre arbitraire)

if '!' in sentence:               # si '!' est contenu dans l'ensemble...
    print("Quel enthousiasme !")  # on affiche un message
{'o', 'j', 'n', 'B', ' ', 'u', 'l', 'm', 'd', 'r', 'e', '!'}
o
j
n
B

u
l
m
d
r
e
!
Quel enthousiasme !