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.

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})])