Les dictionnaires et les ensembles

Programming · course

Voir tous les documents en programmation

UVT : MASTER BADS

M 5

PYTHON

Les dictionnaires et les ensembles

Enseignante: Mme Lamia MANSOURI

Année universitaire: 2020-2021

1

1. Les tableaux associatifs

Un tableau associatif est un type de données permettant de stocker des couples (cle : valeur), avec un accès très rapide à la valeur à partir de la clé. La clé ne peut être présente qu’une seule fois dans le tableau.

Il possède les caractéristiques suivantes :

▪L’opérateur d’appartenance d’une clé (in) ▪La fonction taille (len()) donnant le nombre de couples stockés; ▪Il est itérable (on peut le parcourir) mais il n’est pas ordonné.

Python propose le type standard dict.

2

2. Les dictionnaires (dict)

Les chaînes, les listes et les tuples: - des suites ordonnées d’éléments.

- On peut accéder à un élément quelconque à l’aide d’un index

▪ Un dictionnaire en python est une sorte de liste mais au lieu d'utiliser des index , on utilise des

clés alphanumériques.

▪ Les dictionnaires mappent * clés * en * valeurs * . ▪ Comme les listes, les dictionnaires sont modifiables. ▪ La clé qui peut être n’importe quel type non-modifiable (les chaînes,les nombres et les tuples

s’ils ne contiennent que des éléments non modifiables)

Syntaxe

Nom-Collection= { Cle1 : valeur1, cle2 :valeur2, … Clen :valeurn }

Pour accéder à la valeur du dictionnaire, nous utilisons la syntaxe suivante:

nom_dictionnaire[clé]

3

Exemple

4

On veut créer un dictionnaire de langue, pour la traduction de termes informatiques anglais en français.

dico = {} # création d’un dictionnaire vide dico['computer'] = 'ordinateur' dico['mouse'] ='souris' dico['keyboard'] ='clavier' print(dico) #on aura ceci : # on aura ceci : # {'computer': 'ordinateur', 'mouse': 'souris’, 'keyboard': 'clavier'}

print (dico['mouse’]) # affiche souris

Autres exemples de clé

5

Considérons par exemple que nous voulions répertorier des sur un grand terrain rectangulaire. Nous pouvons pour cela utiliser un dictionnaire, dont les clés seront des tuples indiquant les coordonnées x,y de chaque arbre :

arb = {} arb[(1,2)] = 'Peuplier' arb[(3,4)] = 'Platane' arb[6,5] = 'Palmier'# on peut éliminer les () arb[5,1] = 'Cycas' arb[7,3] = 'Sapin' print(arb[(6,5)])# affiche palmier print(arb) #on aura cet affichage : #{(3, 4):'Platane',(6, 5):'Palmier',(5, 1):'Cycas',(1, 2):'Peuplier',(7, 3):'Sapin'} print(arb[1,2])# affiche Peuplier print(arb[2,1]) # affiche ***** Erreur : KeyError: (2, 1) *****

Pour résoudre cet erreur , on utilise la méthode get(). Le 1er argument transmis à cette méthode est la clé de recherche, 2ème argument est la valeur que nous voulons obtenir en retour si la clé n’existe pas dans le dictionnaire :

print(arb.get((1,2), 'néant’)) # affiche Peuplier print(arb.get((2,1), 'néant’)) # affiche néant

Remarque

6

 Les dictionnaires ne sont pas des séquences : Les éléments d'un dictionnaire ne sont pas disposés dans un ordre particulier. Des opérations comme la concaténation et l'extraction (d'un groupe d'éléments contigus) ne peuvent donc tout simplement pas s'appliquer ici.

Si vous essayez tout de même, Python lèvera une erreur lors de l'exécution du code :

print (arb[1:3])

***** Erreur : KeyError: slice(1, 3, None) *****

2.1 Opérations sur les dictionnaires

7

▪ del

Publicité

Pour enlever un élément du dictionnaire on utiliser l’instruction del

Exemple :

invent = {'pommes':430,'bananes': 312,'oranges':274,'poires': 137}

print(invent)

affiche {'oranges': 274, 'pommes': 430, 'bananes': 312, 'poires': 137}

del (invent['pommes'])

print (invent)

affiche {'oranges': 274, 'bananes': 312, 'poires': 137} I

▪ len()

La fonction len() est utilisable avec un dictionnaire : elle en renvoie le nombre d'éléments.

2.2 Parcours d'un dictionnaire

8

On peut utiliser une boucle for pour parcourir un dictionnaire, mais au cours de l'itération, ce sont les

clés utilisées dans le dictionnaire qui seront successivement affectées à la variable de travail, et non les valeurs. L'ordre dans lequel les éléments seront extraits est imprévisible.

Exemple :

for clef in invent:

print(clef, invent[clef])

2.3 méthodes sur les dictionnaires

9

méthode keys

values

items

description

renvoie la liste des clés utilisées dans le dictionnaire

renvoie la liste des valeurs mémorisées dans le dictionnaire extrait du dictionnaire une liste équivalente de tuples

exemple

print (dico.keys() )

affiche dict_keys['computer', 'keyboard', 'mouse']

print (dico.values()) #affiche dict_values ['ordinateur', 'clavier', 'souris']

print (invent.items()) #affiche[('oranges', 27), ('bananes', 312), ('poires',137)]

Update([ dict]) Mets à jour le dictionnaire.

Il est possible de concaténer deux dictionnaires avec cette méthode. Les doublons sont automatiquement fusionnés. Supprime tous les éléments du dictionnaire.

clear()

for key, value in invent.items(): print( "Clé :",key," | valeur :", value) d={'apples':1,'oranges':3,'pears': 2} ud = {'pears': 4,'grapes': 5, 'lemons': 6} d.update(ud) print(d) # {'grapes': 5, 'pears': 4, 'lemons': 6, 'apples': 1, 'oranges': 3}

2.3 méthodes sur les dictionnaires

10

méthode copy

description La méthode copy() permet d'effectuer une vraie copie d'un dictionnaire. Il faut savoir en effet que la simple affectation d'un dictionnaire existant à une nouvelle variable crée seulement une nouvelle référence vers le même objet, et non un nouvel objet (aliasing).

exemple

invent = {'bananes':312,'oranges':274,'poires':137} stock = invent print (stock) del(invent['bananes']) print (stock) #affiche{'oranges':27,'poires’: 137}

#Si on modifie "invent", alors stock aussi est modifié, #et vice-versa car les deux référencent le même objet

Avec copy magasin = stock.copy() magasin['prunes'] = 561 print (magasin) #{'oranges':27,'prunes':561,'poires': 137} print(stock ) #{'oranges': 274, 'poires': 137} print (invent) # {'oranges': 274, 'poires': 137}

11

méthodera

description pop( clé[, d]) Supprimez l'élément avec "clé" et

Publicité

renvoyez sa valeur ou "d" si "clé" est introuvable. Si "d" n'est pas fourni et que "key" n'est pas trouvé, KeyError est levée.

exemple

D={"prenom":"lamia", "ville":"rades", "age":20} print(D) #{'prenom': 'lamia', 'ville': 'rades', 'age': 20}

print("val : ", D.pop('nom','inexistant’)) # val : inexistant print("pop : ",D) # pop : {'prenom': 'lamia', 'ville': 'rades', 'age': 20}

popitem()

Supprimer et renvoyer un élément arbitraire (clé, valeur). KeyError si le dictionnaire est vide. get( clé[, d]) Renvoie la valeur de la clé. Si la clé

D={"prenom":"lamia", "ville":"rades", "age":20}

n'existe pas, retourne d (la valeur par défaut est None).

print(D.get("ville")) #rades

3. Les ensembles

12

 Un ensemble est une collection itérable non ordonnée d’éléments hachables uniques.

 C’est la transposition informatique de la notion d’ensemble mathématique.

En python, on trouve deux types d’ensembles:

▪Le set qui est un objet modifiable

▪le frozenset qui est un objet immuable (le mot anglais frozen signifie gelé en français)

3.1 Déclarer un set

Il y a deux manières de déclarer un set. • En utilisant des accolades.

s = { "anas", "lamia", "amine", "aziz"} print(s) # affiche {‘lamia’, ‘aziz’, ‘anas’, ‘amine’}

Notez bien qu’il s’agit d’un ensemble non ordonné ce qui explique que print() retourne les éléments dans un ordre aléatoire.

3. Les ensembles

13

 Un ensemble est une collection itérable non ordonnée d’éléments hashables uniques.

 C’est la transposition informatique de la notion d’ensemble mathématique.

En python, on trouve deux types d’ensembles:

▪Le set qui est un objet modifiable

▪le frozenset qui est un objet immuable (le mot anglais frozen signifie gelé en français)

3.1 Déclarer un set

Il y a deux manières de déclarer un set. • En utilisant des accolades

s = { "anas", "lamia", "amine", "aziz"} print(s) # affiche {'lamia', 'aziz', 'anas', 'amine'}

Notez bien qu’il s’agit d’un ensemble non ordonné ce qui explique que print() retourne les éléments dans un ordre aléatoire.

•

En transformant une liste en set grâce au constructeur set()

14

s2 = set(["lamia", "lamia", (1,2,3), 7.56])

print(s2) # affiche {7.56, 'lamia', (1, 2, 3)}

Notez qu’on a déclaré dans le set avec un doublon ('lamia') mais, celui-ci n’est pas pris en compte et ne lève même pas d’exception. Au fait, le e set est une collection d’objets uniques.

Il n’est pas possible de déclarer un ensemble vide avec la première méthode. Cela créé un

• dictionnaire.

s = {}

print(type(s)) # affiche <class 'dict'>

Pour créer un ensemble vide, pas d’autre choix que d’utiliser la deuxième méthode.

s = set()

print(type(s)) #affiche <class 'set'>

3.2 Aperçu de quelques opérations mathématiques associées aux sets

Publicité

• Différence entre deux sets s = {"amine", "aziz", "anas", "ahmed"} s2 = {"amine", "anas"} s3 = s - s2 print("s3 =", s3) # s3={'aziz’, 'ahmed’}

• Union de deux sets s = {"Python", "php"} s2 = {"java", "html"} s3 = s | s2 print("s3 =", s3)# s3 = {'html', 'php', 'java', 'Python’}

Intersection de deux sets

• s = {"Python", "php"} s2 = {"java", "php"} s3 = s & s2 print("s3 =", s3) # s3= {'php'}

15

3.2 Quelques méthodes associées aux sets

• Ajouter un élément avec set.add()

s = {"amine", "anas", "aziz"} s.add("lamia") print(s)

#affiche {‘anas’,’aziz’,’amine’,’lamia’}

• Ajouter tous les éléments d’un autre set avec set.update() s = {"amine", "ahmed", "Mohamed"} S2 = {1, 2, 3} s.update(s2) print("s =", s) print("s2 =", s2)

s = {1, 2, 3, ‘amine’, ‘ahmed’, ‘Mohamed’} # s2 = {1, 2, 3}

Comme vous pouvez le constater, cette méthode rajoute les éléments de l’ensemble s2 dans l’ensemble s sans pour autant vider l’ensemble s2.

16

Supprimer un élément avec set.remove() et set.discard() s = {"amine", "ahmed", "Mohamed", "aziz"} s.remove("ahmed") print(s)

{"amine", "ahmed", "Mohamed", "aziz"}

Attention! Avec set.remove(), Python lève une exception si vous essayez d’enlever un élément qui n’appartient pas au set. s = {"amine", "ahmed", "Mohamed", "aziz"} s.remove("salah") print(s)

on aura KeyError: ‘salah’

Pour éviter cela, utiliser la méthode set.discard() qui, elle, ne lèvera pas d’exception. s = {"amine", "ahmed", "Mohamed", "aziz"} s.discard("salah") print(s) # {"amine", "aziz", "Mohamed", "ahmed"}

Vider un set avec la méthode set.clear() s = {"amine", "ahmed", "Mohamed", "aziz"} s.clear() print("s =", s)# affiche s=set()

17

4. Les frozensets

18

Problèmes avec les ensembles

▪ Les ensembles étant modifiables sont unhashable ➔ ils ne peuvent pas être utilisés comme des

clés de dictionnaires.

▪ On ne peut pas mettre un set dans un autre.

▪ Frozenset est une nouvelle classe qui présente les caractéristiques d'un ensemble, mais ses

éléments ne peuvent pas être modifiés une fois affectés.➔ les méthodes telles que add() ou remove() ne peuvent pas leur être applicables.

▪ Les tuples sont des listes immuables, les frozensets sont des ensembles immuables.

▪ Notez bien que frozenset() fonctionne également avec un tuple ou une liste

Déclaration d’un frozenset:

Les Frozensets peuvent être créés en utilisant la fonction frozenset().

19

Exemples

villes = set (["tunis", "Béja", "Nabeul"])

villes = frozenset (["tunis", "Béja", "Nabeul"])

villes.add ("Sousse")

villes.add ("Sousse")

print(villes) # affiche {'Sousse', 'Béja', 'tunis', 'Nabeul'}

print(villes)

AttributeError: 'frozenset' object has no attribute 'add'

tup = (1, 2, 3) T_fr_s = frozenset(tup) print(type(T_fr_s)) #<class 'frozenset’>

#une fois déclaré, un frozenset peut appartenir à un set car il est devenu immuable liste = [1, 2, 3] fr_s = frozenset(liste) print(type(fr_s)) # <class ‘frozenset’> s = {fr_s, 4, 5} print("s =", s)

#s = {5, frozenset({1, 2, 3}), 4}