python:bases:ensembles

Modules Dictionnaires Sommaire Python et microPython

[Mise à jour le : 30/6/2021]

  • Mots-clés : ensemble, mutable, immuable, union, intersection, différence, différence symétrique, comparaison, égalité, inclusion, disjoint.
Les mots ci-dessous sont dits “réservés”. Ils ne peuvent pas être utilisés comme nom de variable. Les mots soulignés sont une nouveauté de Python 3. Les mots en gras sont utilisés dans cette page.
and continue finally is raise
as def for lambda return
assert del from None True
async elif global nonlocal try
await else if not while
break except import or with
class False in pass yield
  • Fonctions natives (built-in)1) utilisées dans les exemples : frozenset(), len() print(), set().

Proche des dictionnaires, les sets ne stockent qu'une clé. Ils sont très utilisés pour garder le nombre d'éléments uniques d'une séquence ou faire le test d'appartenance sur les éléments d'une séquence. Un set peut stocker n'importe quel élément hashable (entier,caractère, booléen etc.).

Les ensembles ne sont pas ordonnés !

2.1 Création en extension

On crée un ensemble avec les accolades, comme les dictionnaires, mais sans utiliser le caractère “:” ou avec la fonction set().

Exemple 1 : avec des accolades

*.py
# Un set sur une liste élimine les doublons
ensemble = {'marc', 12, 'pierre', (1, 2, 3), 'pierre'} 
print(ensemble) # Résultat : {'marc', 'pierre', 12, (1, 2, 3)}

Exemple 2 : avec la fonction set()

*.py
# Un set sur une liste élimine les doublons
ensemble = set(['marc', 12, 'pierre', (1, 2, 3), 'pierre'])
print(ensemble) # Résultat : {'marc', 'pierre', 12, (1, 2, 3)}

2.1 Création d'un ensemble vide

Un ensemble vide se crée seulement avec la fonction set().

Exemple

*.py
ensemble_vide = set()
# ou
ensemble_vide = set([])

ATTENTION

Les éléments d'un ensemble doivent être globalement immuables. Le type set étant mutable, on ne peut pas créer un ensemble d'ensembles.

Source set, frozenset

Un frozenset est un ensemble qu'on ne peut pas modifier, et qui donc peut servir de clé dans un dictionnaire, ou être inclus dans un autre ensemble (mutable ou pas).

5.1 Test d'appartenance

*.py
a = {'marc', 'pierre', 12, (1, 2, 3)}
'pierre' in a # Résultat :True
6 in a # Résultat : False
Lors d'un test d'appartenance sur une séquence, convertir la séquence en set accélère le traitement.

5.2 Cardinal

  • Nombre d'éléments dans un ensemble
*.py
a = {'marc', 'pierre', 12, (1, 2, 3)}
len(a) # Résultat : 4

5.3 Manipulations

  • Suppression des doublons dans une liste
*.py
a = {['marc', 'pierre', 12, (1, 2, 3), 12, 'marc']}
print(a)  # Résultat : {(1, 2, 3), 12, 'marc', 'pierre'}
  • Vidage
*.py
# pour nettoyer
a = {'marc', 'pierre', 12, (1, 2, 3)}
a.clear() # Résultat : set()
  • Ajout d'un élément
*.py
# ajouter un élément
a = {'marc', 'pierre', 12, (1, 2, 3)}
a.add(1) # Résultat : {1, (1, 2, 3), 12, 'marc', 'pierre'}
  • Mise à jour d'un ensemble avec un autre ensemble
*.py
# ajouter tous les éléments d'un autre ensemble
a = {'marc', 'pierre', 12, (1, 2, 3)}
a.update({2, (1, 2, 3), (1, 3, 5)}) # Résultat : {2, (1, 3, 5), 'pierre', (1, 2, 3), 12, 'marc'}
  • Suppression d'un élément
*.py
# enlever un élément avec discard
a = {2, (1, 3, 5), 'pierre', (1, 2, 3), 12, 'marc'}
a.discard((1, 3, 5)) # Résultat : {2, 'pierre', (1, 2, 3), 12, 'marc'}
discard fonctionne même si l'élément n'est pas présent.
*.py
# enlever un élément avec remove
a = {2, (1, 3, 5), 'pierre', (1, 2, 3), 12, 'marc'}
a.remove('jean') # Résultat : exception

ATTENTION

Contrairement à discard, l'élément doit être présent, sinon il se produit une exception.
*.py
# pop() ressemble à la méthode éponyme sur les listes
# sauf qu'il n'y a pas d'ordre dans un ensemble
a = {2, (1, 3, 5), 'pierre', (1, 2, 3), 12, 'marc'}
while a:
    a = a.pop()
    print("element", a)
print("l'ensemble est vide", a)
 
# Résultat
# element 2
# element (1, 3, 5)
# element pierre
# element (1, 2, 3)
# element 12
# element marc
# l'ensemble est vide set()

5.4 Opérations sur les ensembles

Les notations des opérateurs sur les ensembles rappellent les opérateurs “bit-à-bit” sur les entiers.
Ces opérateurs sont également disponibles sous la forme de méthodes.
  • Union
*.py
A1 = set([0, 2, 4, 6])
A2 = set([0, 6, 3])
A1 | A2 # Résultat : {0, 2, 3, 4, 6}
  • Intersection
*.py
A1 = set([0, 2, 4, 6])
A2 = set([0, 6, 3])
A1 & A2 # Résultat : {0, 6}
  • Différence
*.py
A1 = set([0, 2, 4, 6])
A2 = set([0, 6, 3])
A1 - A2 # Résultat : {2, 4}
  • Différence symétrique
𝐴Δ𝐵=(𝐴−𝐵) ∪ (𝐵−𝐴)
*.py
A1 = set([0, 2, 4, 6])
A2 = set([0, 6, 3])
A1 ^ A2 # Résultat : {2, 3, 4}

5.5 Comparaisons

  • Egalité
*.py
a = {'marc', 'pierre', 12, (1, 2, 3)}
b = set(['pierre', 12, (1, 2, 3), 'marc'])
a==b # Résultat : True
  • Inclusion
*.py
a = {0, 1, 2, 3}
b =  {1, 3}
b <= a # Résultat : True
*.py
a = {0, 1, 2, 3}
b =  {1, 3}
b < a # Résultat : True
  • Ensembles disjoints
*.py
a = {0, 1, 2, 3}
b =  {'marc', 'pierre', 12, (1, 2, 3)}
a.isdisjoint(b) # Résultat : True


1)
Fonctions toujours disponibles.
  • python/bases/ensembles.txt
  • Dernière modification : 2022/09/03 10:31
  • de phil