11.1. Un type élaboré : le dictionnaire#
Lire et effectuer les activités sur le cours de Mme Coilhac sur les dictionnaires
11.1.1. Définition#
Definition 11.1
Un dictionnaire est une collection de couples (clef, valeur)
unique avec un temps d’accès assez rapide.
Note
Un dictionnaire s’écrit entre {}
sous la forme {clef: valeur}
. {}
représente un dictionnaire vide.
Property 11.1
Pour des raisons de performances, la clef doit être immuable.
Note
L’accès à un élément d’un dictionnaire se fait avec la syntaxe indicielle :
meteo = {
"latitude":48.86,
"longitude":2.3399997,
"generationtime_ms":0.10538101196289062,
"utc_offset_seconds":3600,
"timezone":"Europe/Paris",
"timezone_abbreviation":"GMT+1",
"elevation":43.0,
"current_units":{
"time":"iso8601",
"interval":"seconds",
"temperature_2m":"°C",
"relative_humidity_2m":"%",
"apparent_temperature":"°C",
"precipitation":"mm",
"cloud_cover":"%",
"wind_speed_10m":"km/h",
"wind_direction_10m":"°",
"wind_gusts_10m":"km/h"
},
"current":{
"time":"2025-02-06T21:30",
"interval":900,
"temperature_2m":4.7,
"relative_humidity_2m":71,
"apparent_temperature":0.4,
"precipitation":0.00,
"cloud_cover":100,
"wind_speed_10m":14.6,
"wind_direction_10m":57,
"wind_gusts_10m":28.8
}
}
meteo["latitude"]
48.86
11.1.2. Utilisation d’un dictionnaire#
On a vu précédement comment obtenir une clef, ainsi que la syntaxe d’un dictionnaire.
Note
On peut modifier une clef par un appel direct : meteo["elevation"] = 37
changera la valeur associée à la clef "elevation"
pour y affecter la valeur 37
.
Property 11.2
Le mot clef in
permet à la fois de tester l’appartenance d’une clef à un dictionnaire et de parcourir un dictiontionnaire.
"elevation" in meteo
True
"timestamp" in meteo
False
for information in meteo["current"]:
print(information)
time
interval
temperature_2m
relative_humidity_2m
apparent_temperature
precipitation
cloud_cover
wind_speed_10m
wind_direction_10m
wind_gusts_10m
Exercise 11.1 (Renvoyer les valeurs)
Écrire un script qui renvoie une liste de couples grandeur, valeur, unité avec les données météo.
Solution to Exercise 11.1 (Renvoyer les valeurs)
accumulateur = []
for grandeur in meteo["current"]:
accumulateur = accumulateur + [(grandeur, meteo["current"][grandeur], meteo["current_units"][grandeur])]
accumulateur
[('time', '2025-02-06T21:30', 'iso8601'),
('interval', 900, 'seconds'),
('temperature_2m', 4.7, '°C'),
('relative_humidity_2m', 71, '%'),
('apparent_temperature', 0.4, '°C'),
('precipitation', 0.0, 'mm'),
('cloud_cover', 100, '%'),
('wind_speed_10m', 14.6, 'km/h'),
('wind_direction_10m', 57, '°'),
('wind_gusts_10m', 28.8, 'km/h')]
Property 11.3
La fonction len
renvoie la longueur d’un dictionnaire.
len(meteo)
9
11.1.3. Clefs, valeurs ou éléments.#
11.1.3.1. Clefs#
On peut avoir besoin de la liste des clefs d’un dictionnaire. Pour de petits dictionnaire, on peut procéder de la façon suivante :
[clef for clef in meteo]
['latitude',
'longitude',
'generationtime_ms',
'utc_offset_seconds',
'timezone',
'timezone_abbreviation',
'elevation',
'current_units',
'current']
Néanmoins, il existe une fonction des dictionnaires qu’on peut utiliser directement et qui renvoie un objet qu’on peut transformer en list
.
dict.keys(meteo)
dict_keys(['latitude', 'longitude', 'generationtime_ms', 'utc_offset_seconds', 'timezone', 'timezone_abbreviation', 'elevation', 'current_units', 'current'])
11.1.3.2. Valeurs#
Pour obtenir les valeurs d’un dictionnaire, on peut procéder de la façon suivante :
[meteo[clef] for clef in meteo]
[48.86,
2.3399997,
0.10538101196289062,
3600,
'Europe/Paris',
'GMT+1',
43.0,
{'time': 'iso8601',
'interval': 'seconds',
'temperature_2m': '°C',
'relative_humidity_2m': '%',
'apparent_temperature': '°C',
'precipitation': 'mm',
'cloud_cover': '%',
'wind_speed_10m': 'km/h',
'wind_direction_10m': '°',
'wind_gusts_10m': 'km/h'},
{'time': '2025-02-06T21:30',
'interval': 900,
'temperature_2m': 4.7,
'relative_humidity_2m': 71,
'apparent_temperature': 0.4,
'precipitation': 0.0,
'cloud_cover': 100,
'wind_speed_10m': 14.6,
'wind_direction_10m': 57,
'wind_gusts_10m': 28.8}]
De la même façon, il existe une fonction values
:
dict.values(meteo)
dict_values([48.86, 2.3399997, 0.10538101196289062, 3600, 'Europe/Paris', 'GMT+1', 43.0, {'time': 'iso8601', 'interval': 'seconds', 'temperature_2m': '°C', 'relative_humidity_2m': '%', 'apparent_temperature': '°C', 'precipitation': 'mm', 'cloud_cover': '%', 'wind_speed_10m': 'km/h', 'wind_direction_10m': '°', 'wind_gusts_10m': 'km/h'}, {'time': '2025-02-06T21:30', 'interval': 900, 'temperature_2m': 4.7, 'relative_humidity_2m': 71, 'apparent_temperature': 0.4, 'precipitation': 0.0, 'cloud_cover': 100, 'wind_speed_10m': 14.6, 'wind_direction_10m': 57, 'wind_gusts_10m': 28.8}])
11.1.3.3. Items#
Pour obtenir les valeurs d’un dictionnaire, on peut procéder de la façon suivante :
[(clef, meteo[clef]) for clef in meteo]
[('latitude', 48.86),
('longitude', 2.3399997),
('generationtime_ms', 0.10538101196289062),
('utc_offset_seconds', 3600),
('timezone', 'Europe/Paris'),
('timezone_abbreviation', 'GMT+1'),
('elevation', 43.0),
('current_units',
{'time': 'iso8601',
'interval': 'seconds',
'temperature_2m': '°C',
'relative_humidity_2m': '%',
'apparent_temperature': '°C',
'precipitation': 'mm',
'cloud_cover': '%',
'wind_speed_10m': 'km/h',
'wind_direction_10m': '°',
'wind_gusts_10m': 'km/h'}),
('current',
{'time': '2025-02-06T21:30',
'interval': 900,
'temperature_2m': 4.7,
'relative_humidity_2m': 71,
'apparent_temperature': 0.4,
'precipitation': 0.0,
'cloud_cover': 100,
'wind_speed_10m': 14.6,
'wind_direction_10m': 57,
'wind_gusts_10m': 28.8})]
for (clef, valeur) in [('1', 'un'), (2, 'deux')]:
print(valeur, clef)
un 1
deux 2
De la même façon, il existe une fonction items
:
dict.items(meteo)
dict_items([('latitude', 48.86), ('longitude', 2.3399997), ('generationtime_ms', 0.10538101196289062), ('utc_offset_seconds', 3600), ('timezone', 'Europe/Paris'), ('timezone_abbreviation', 'GMT+1'), ('elevation', 43.0), ('current_units', {'time': 'iso8601', 'interval': 'seconds', 'temperature_2m': '°C', 'relative_humidity_2m': '%', 'apparent_temperature': '°C', 'precipitation': 'mm', 'cloud_cover': '%', 'wind_speed_10m': 'km/h', 'wind_direction_10m': '°', 'wind_gusts_10m': 'km/h'}), ('current', {'time': '2025-02-06T21:30', 'interval': 900, 'temperature_2m': 4.7, 'relative_humidity_2m': 71, 'apparent_temperature': 0.4, 'precipitation': 0.0, 'cloud_cover': 100, 'wind_speed_10m': 14.6, 'wind_direction_10m': 57, 'wind_gusts_10m': 28.8})])