Cours de NSI Première

Constructions élémentaires Booléens Fonctions Chaînes de caractères Tableaux p-uplets et dictionnaires Tables de données Flottants Algorithmes classiques Index Énoncés

Chapitre 6 : p-uplets et dictionnaires

p-uplets, fonctions retournant un p-uplet, p-uplets nommés, dictionnaires, clés et valeurs

Partie A - p-uplets

Notion de p-uplet

Un p-uplet permet, comme un tableau, de stocker en mémoire plusieurs valeurs dans une seule variable. En Python, le type p-uplet est appelé tuple.

Les extrémités du p-uplet sont repérées par des parenthèses et les valeurs sont séparées par des virgules.

In [1]:
date = ('La prise de la Bastille', 14, 7, 1789)

Comme pour un tableau, les valeurs contenues dans un p-uplet sont indexées par des entiers, à partir de l'index 0, et la fonction len permet de connaître le nombre de valeurs contenues dans le p-uplet.

In [2]:
print(date[0] + ' a eu lieu le ' + str(date[1]) + '/' + str(date[2]) + '/' + str(date[3]) + '.')
La prise de la Bastille a eu lieu le 14/7/1789.
In [3]:
len(date)
Out[3]:
4

Mais, à la différence d'un tableau, il n'est pas possible de modifier les valeurs contenues dans un p-uplet, ou d'en ajouter. On parle d'immutabilité.

In [4]:
date[0] = 'La fête de la Fédération' # Ces affectations
date[3] = 1790                       # provoquent une erreur
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-1d10f46aa946> in <module>
----> 1 date[0] = 'La fête de la Fédération' # Ces affectations
      2 date[3] = 1790                       # provoquent une erreur

TypeError: 'tuple' object does not support item assignment

Seule une redéfinition complète du p-uplet est possible.

In [5]:
date = ('La fête de la Fédération', 14, 7, 1790)
print(date[0] + ' a eu lieu le ' + str(date[1]) + '/' + str(date[2]) + '/' + str(date[3]) + '.')
La fête de la Fédération a eu lieu le 14/7/1790.

Le tableau union_europeenne défini ci-dessous contient six p-uplets représentant les six pays fondateurs de l'UE.

Chaque p-uplet contient trois valeurs : le nom du pays, sa population en 2016 (en milliers d'habitants) et sa superficie (en kilomètres carrés).

In [6]:
union_europeenne = [('Allemagne', 82162, 356900),
                    ('Belgique', 11289, 30500),
                    ('France', 66661, 544000),
                    ('Italie', 60665, 301300),
                    ('Luxembourg', 576, 2600),
                    ('Pays-Bas', 16979, 41200)]

Question 1 : Ecrire le code permettant de calculer la population totale des six pays fondateurs de l'UE.

In [7]:
population_totale = 0
for k in range(6):
    population_totale += union_europeenne[k][1]
population_totale *= 1000
print(population_totale)
238332000

Question 2 : Ecrire le code permettant d'afficher, pour chaque pays fondateur de l'UE, sa densité de population (en habitants par kilomètre carré, arrondie à l'entier le plus proche grâce à la fonction round).

In [8]:
for k in range(6):
    pays = union_europeenne[k]
    print(pays[0], ':', round(pays[1] * 1000 / pays[2]), 'hab/km2')
Allemagne : 230 hab/km2
Belgique : 370 hab/km2
France : 123 hab/km2
Italie : 201 hab/km2
Luxembourg : 222 hab/km2
Pays-Bas : 412 hab/km2

Utilisation des p-uplets pour permettre à une fonction de retourner plusieurs valeurs

Question 3 : Ecrire la spécification de la fonction suivante :

In [9]:
def perimetre_et_aire_triangle(a, b, c):
    """
    Calcule le périmètre et l'aire d'un triangle dont les côtés mesurent a, b et c
    - Entrées : a, b, c (nombres strictement positifs)
    - Sortie : couple de nombres constitué du périmètre et de l'aire du triangle
    """
    if type(a) not in [int, float] or type(b) not in [int, float] or type(c) not in [int, float]:
        raise TypeError('les arguments doivent être des nombres')
    if a <= 0 or b <= 0 or c <= 0:
        raise ValueError('les arguments doivent être strictement positifs')
    perimetre = a + b + c
    demi_per = perimetre / 2
    # l'aire du triangle est calculée avec la formule de Héron
    aire = (demi_per * (demi_per-a) * (demi_per-b) * (demi_per-c))**0.5
    return (perimetre, aire)

Il y a deux façons d'appeler une fonction qui retourne un p-uplet.

In [10]:
couple = perimetre_et_aire_triangle(3, 4, 5)
print('Le périmètre est', couple[0], 'et l\'aire est', couple[1])
Le périmètre est 12 et l'aire est 6.0

Dans le premier cas, les deux valeurs du p-uplet retourné sont stockées dans une seule variable.

In [11]:
p, a = perimetre_et_aire_triangle(3, 4, 5)
print('Le périmètre est', p, 'et l\'aire est', a)
Le périmètre est 12 et l'aire est 6.0

Dans le second cas, ces deux valeurs sont stockées dans deux variables indépendantes.

Question 4 : Définir une fonction nouveau_pays qui demande à l'utilisateur de saisir successivement au clavier le nom, la population et la superficie d'un pays, et qui retourne un p-uplet de la forme (nom, population, superficie).

In [12]:
def nouveau_pays():
    nom = input('Nom du pays : ')
    pop = int(input('Population (en milliers) : '))
    sup = int(input('Superficie (en km2) : '))
    return (nom, pop, sup)
Nom du pays
Population (milliers)
Superficie (km2)
Nom du pays
Population (milliers)
Superficie (km2)
Nom du pays
Population (milliers)
Superficie (km2)
Autriche
8 508
83 900
Finlande
5 451
337 100
Pologne
38 496
312 678
Bulgarie
7 246
110 910
Grèce
10 993
132 000
Portugal
10 427
92 400
Chypre
858
9 251
Hongrie
9 879
93 032
Roumanie
19 943
238 391
Croatie
4 246
56 642
Irlande
4 604
70 300
Slovaquie
5 416
49 035
Danemark
5 627
43 100
Lettonie
2 001
64 597
Slovénie
2 061
20 273
Espagne
46 508
504 800
Lituanie
2 943
65 300
Suède
9 645
450 000
Estonie
1 316
45 227
Malte
425
316
Rép. tchèque
10 512
78 870

Question 5 : Après avoir exécuté les deux cellules ci-dessous, expliquer le rôle de la fonction clear_output.

In [13]:
from IPython.display import clear_output
In [14]:
for _ in range(21):
    union_europeenne.append(nouveau_pays())
    clear_output()
La fonction clear_output permet d'effacer du Notebook Jupyter l'affichage situé sous la cellule en cours d'exécution, ce qui en améliore la lisibilité dans certaines situations.

Question 6 : Ecrire un programme calculant la population, la superficie et la densité de population de l'UE.

In [15]:
population_totale = 0
superficie_totale = 0
for k in range(27):
    population_totale += union_europeenne[k][1]
    superficie_totale += union_europeenne[k][2]    
population_totale *= 1000
print('La population de l\'UE est de ' + str(population_totale) + ' habitants.')
print('La superficie de l\'UE est de ' + str(superficie_totale) + ' km2.')
print('La densité de l\'UE est de ' + str(population_totale//superficie_totale) + ' hab/km2.')
La population de l'UE est de 445437000 habitants.
La superficie de l'UE est de 4134622 km2.
La densité de l'UE est de 107 hab/km2.

Partie B - Dictionnaires

Les éléments d'un tableau ou d'un p-uplet sont toujours indexés par des entiers positifs, ce qui peut rendre leur manipulation délicate ou créer des confusions.

En reprenant l'exemple des pays de l'UE traité précédemment, il est nécessaire de se souvenir que chaque pays est représenté par un p-uplet dont la première valeur est le nom du pays, la deuxième la population et la troisième la superficie.

Si on souhaite que les valeurs soient indexées par des mots-clés plutôt que par des entiers, on utilise un type de variable particulier : un dictionnaire.

Les extrémités d'un dictionnaire sont repérées par des accolades. Chaque valeur est précédée d'une clé, avec la syntaxe cle : valeur, et les associations clé/valeur sont séparées les unes des autres par des virgules.

In [16]:
pays = {'nom' : 'la France', 'population' : 66661, 'superficie' : 544000}

Question 7 : Après avoir exécuté la cellule suivante, expliquer le rôle de la fonction len et des commandes .keys(), .values() et .items().

In [17]:
print(len(pays))
print(pays.keys())
print(pays.values())
print(pays.items())
3
dict_keys(['nom', 'population', 'superficie'])
dict_values(['la France', 66661, 544000])
dict_items([('nom', 'la France'), ('population', 66661), ('superficie', 544000)])
La fonction len renvoie la longueur (c'est-à-dire le nombre de clés) du dictionnaire qui est passé en argument.
La commande .keys() liste les clés du dictionnaire, la commande .values() liste les valeurs et la commande .items() liste les associations clé/valeur.

Question 8 : Dans la cellule suivante, on définit une fonction afficher_informations. Compléter la spécification de la fonction en indiquant quelles clés doit au minimum contenir le dictionnaire p pour que l'exécution se déroule sans erreur.

In [18]:
def afficher_informations(pays):
    """
    Affiche à l'écran diverses informations sur le pays
    - Entrée : pays (dictionnaire contenant au moins les clés 'nom', 'population' et 'superficie')
    - Effet de bord : affichage à l'écran
    """
    if type(pays) != dict:
        raise TypeError('l\'argument doit être un dictionnaire')
    for cle in ['nom', 'population', 'superficie']:
        if cle not in pays.keys():
            raise KeyError('l\'argument doit posséder la clé ' + str(cle))
    print('La population de ' + pays['nom'] + ' est de ' + str(pays['population']*1000) + ' hab.')
    print('Sa superficie est de ' + str(pays['superficie']) + ' km2.')
    print('Sa densité est de ' + str(round(pays['population']*1000/pays['superficie'])) + ' hab/km2.')
    if 'monnaie' in pays.keys():
        print('Sa monnaie est ' + pays['monnaie'] + '.')
In [19]:
afficher_informations(pays)
La population de la France est de 66661000 hab.
Sa superficie est de 544000 km2.
Sa densité est de 123 hab/km2.
Les lignes 9 à 11 constituent une assertion dont le but est de vérifier que le dictionnaire pays passé en argument contient bien au moins les clés 'nom', 'population' et 'superficie'.

Un dictionnaire est mutable : il est possible de modifier la valeur associée à une clé, de créer une clé supplémentaire ou de supprimer une clé.

In [20]:
# On modifie la valeur associée à trois clés existantes
pays['nom'] = 'la Grèce'
pays['population'] = 10993
pays['superficie'] = 132000
# On définit deux nouvelles clés
pays['capitale'] = 'Athènes'
pays['monnaie'] = 'l\'euro'
afficher_informations(pays)
La population de la Grèce est de 10993000 hab.
Sa superficie est de 132000 km2.
Sa densité est de 83 hab/km2.
Sa monnaie est l'euro.
L'exécution de cette cellule a entraîné la définition de deux nouvelles clés pour le dictionnaire pays, à savoir 'capitale' et 'monnaie'.
La syntaxe pour définir une nouvelle clé est la suivante : dictionnaire[nouvelle_cle] = nouvelle_valeur.
In [21]:
# On supprime une clé
del pays['nom']
print(pays.keys())
dict_keys(['population', 'superficie', 'capitale', 'monnaie'])
L'exécution de cette cellule a entraîné la suppression de la clé 'nom'.
La syntaxe pour supprimer une clé est la suivante : del dictionnaire[cle_a_supprimer].

Ce que vous devez savoir

  • Définir un p-uplet.
  • Accéder aux valeurs contenues dans un p-uplet via leur index.
  • Utiliser la fonction round pour arrondir une valeur numérique.
  • Utiliser la fonction clear_output pour effacer l'affichage sous la cellule en cours d'exécution.
  • Définir un dictionnaire en listant ses associations clé/valeur.
  • Utiliser sur un dictionnaire la fonction len et les commandes .keys(), .values() et .items().
  • Ecrire une assertion permettant de vérifier qu'un dictionnaire dispose de certaines clés.
  • Ajouter ou supprimer des associations clé/valeur dans un dictionnaire.