Aller au contenu

Villes⚓︎

D'après 2022, Nouvelle-Calédonie, J1, Ex. 3

Partie 1⚓︎

Dans un fichier villes_56.csv, on a regroupé les neufs villes du Morbihan de plus de \(10\,000\) habitants en 2012.

Fichier villes_56.csv
dep nom nb_hab_1999 nb_hab_2012 densite superficie alt_min alt_max
56 Lorient 59224 58100 3272 17.48 0 46
56 Vannes 51759 53000 1625 32.3 0 56
56 Lanester 21901 22500 1209 18.37 0 51
56 Ploemeur 18301 18200 448 39.72 -1 55
56 Hennebont 13410 14600 818 18.57 0 82
56 Pontivy 13501 13700 553 24.85 48 192
56 Auray 10899 12500 1783 6.91 0 43
56 Guidel 9155 10100 198 52.29 0 70
56 Saint-Avé 8298 10100 400 26.09 12 136

1) On exécute le programme suivant :

Programme 1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def read_CSV(filename):
    """ filename est une chaine de caractères correspondant au nom d'un fichier du type csv.
    La fonction renvoie une variable de type list
    """
    csv_file = open(filename, mode='r', encoding='utf-8', newline='') 
    fichier = csv.DictReader(csv_file)
    table = [dict(ligne) for ligne in fichier]
    # les lignes 6 et 7 permettent d'obtenir une liste de dictionnaires dont
    # les clés correspondent à la première ligne du fichier csv_file 
    csv_file.close()
    return table

villes = read_CSV("villes_56.csv")
print(villes)

1.a) À partir des quatre propositions ci-dessous, indiquer ce que signifie "utf-8" à la ligne 5.

  • Réponse A : type de codage de caractères informatiques
  • Réponse B : nom du dossier contenant le fichier
  • Réponse C : nom du fichier
  • Réponse D : taille du fichier
Réponse

Il s'agit de la réponse A, l'encodage des caractères utilisé dans le fichier

1.b) Indiquer ce que signifie le mode='r' à la ligne 5.

Réponse

Il s'agit du mode d'ouverture du fichier :

  • 'r' (pour read) signifie que le fichier est ouvert en lecture seule.

Les autres modes possibles sont :

  • 'w' (pour write) mode d'accès en écriture avec effacement du contenu si le fichier existe déjà,
  • 'a' (pour append) mode d'accès en écriture avec ajout en fin de fichier si le fichier existe déjà.

2) Après exécution du Programme 1, voici le début de l'affichage obtenu :

🐍 Console Python
[{'dep': '56',
 'nom': 'Lorient',
 'nb_hab_1999': '59224',
 'nb_hab_2012': '58100',
 'densite': '3272',
 'superficie': '17.48',
 'alt_min': '0',
 'alt_max': '46'},
{'dep': '56', ...}]

2.a) Indiquer le type Python de la variable villes.

Réponse

La variable villes référence un objet de type list ; dont les éléments sont des dictionnaires.

2.b) Indiquer ce que renvoie villes[1] en précisant son type.

Réponse

villes[1] renvoie le dictionnaire (type dict) d'indice 1 de la liste :

🐍 Console Python
{'dep': '56', 
 'nom': 'Vannes', 
 'nb_hab_1999': '51759', 
 'nb_hab_2012': '53000', 
 'densite': '1625', 
 'superficie': '32.3', 
 'alt_min': '0', 
 'alt_max': '56 '}

2.c) Écrire une instruction permettant d'obtenir le nombre d'habitants de Pontivy en 2012.

Réponse

Pour obtenir le nombre d'habitants de Pontivy en 2012, et en considérant que l'ordre du tableau csv est bien respecté :

🐍 Console Python
villes[5]['nb_hab_2012']

Si on ne sait pas que la ville de Pontivy est à l'indice \(5\), alors on peut faire :

🐍 Script Python
for ville in villes:
    if ville['nom'] == 'Pontivy':
        print(ville['nb_hab_2012'])

Partie 2⚓︎

On considère que villes résulte de l'exécution du Programme 1, et on suppose qu'ensuite, avec un traitement, les données figurant dans les colonnes 2 à 7 du tableau villes sont des entiers ou des flottants.

1) Indiquer ce que renvoie l'expression suivante appliquée à villes :

🐍 Console Python
>>> [(d['nom'], d['alt_max']) for d in villes if d['alt_max'] > 100]
Réponse

On obtient la liste des couples constitués d'un nom de ville et de son altitude maximale, pour les villes ayant une altitude maximale supérieure à 100. Soit :

🐍 Console Python
[('Pontivy', 192), ('Saint-Avé', 136)]

2) Écrire en langage Python une fonction variations qui prend en paramètre une liste de villes (du même type que la variable villes) et renvoie la différence entre le nombre d'habitants en 2012 et celui en 1999 cumulée pour toutes les villes.

Réponse
🐍 Script Python
def variations(villes: list):
    nb_hab_total_1999 = 0
    nb_hab_total_2012 = 0
    for ville in villes:
        nb_hab_total_1999 += ville['nb_hab_1999']
        nb_hab_total_1999 += ville['nb_hab_2012']
    return nb_hab_total_2012 - nb_hab_total_1999

Où en une ligne avec la fonction prédéfinie sum :

🐍 Script Python
def variations(villes: list):
    return sum(ville['nb_hab_1999'] - ville['nb_hab_2012'] for ville in villes)

3) On admet que toutes les villes sont de superficie distincte. Écrire en langage Python une fonction max_superficie qui prend en paramètre une liste de villes (du même type que la variable villes) et renvoie la ville ayant la plus grande superficie.

Réponse
🐍 Script Python
def max_superficie(villes: list):
    plus_grande_ville = villes[0]
    maxi = plus_grande_ville['superficie']
    for ville in villes:
        superficie_courante = ville['superficie']
        if superficie_courante > maxi:
            maxi = superficie_courante
            plus_grande_ville = ville
    return plus_grande_ville

Remarquons que si on avait juste voulu le nom de la ville ayant la plus grande superficie, il aurait fallu mettre en dernière ligne :

🐍 Script Python
return plus_grande_ville['nom']