Aide-mémoire : les structures de données

Le dictionnaire (clé/valeur) et le tableau 2D (grille)

dictionnaire - clé/valeur tableau 2D - grille parcourir et tester tableau de synthèse pièges fréquents

Le dictionnaire : créer, accéder

Un dictionnaire associe des clés à des valeurs. On le crée avec des accolades {}. Chaque paire s'écrit clé: valeur. On accède à une valeur en donnant sa clé entre crochets.

Créer un dictionnaire

nom = {"clé": valeur, ...}

arbre = {"espece": "erable", "hauteur": 12, "age": 40} arbre["espece"] # "erable" arbre["hauteur"] # 12 arbre["age"] # 40

Les clés sont uniques et servent d'étiquettes. La valeur peut être de n'importe quel type : texte, nombre, booléen, liste, etc.

Dictionnaire vide - puis remplir

nom = {}

mesure = {} mesure["temperature"] = 21.5 mesure["humidite"] = 68 # mesure est maintenant {"temperature": 21.5, "humidite": 68}

On crée un dictionnaire vide avec {} puis on y ajoute des paires clé/valeur une à une, comme on ajoute des entrées dans un carnet.

Modifier, ajouter, supprimer

On modifie une valeur existante ou on en ajoute une nouvelle de la même façon : dico[clé] = nouvelle_valeur. Pour supprimer, on utilise le mot-clé del.

Modifier et ajouter

dico["clé"] = nouvelle_valeur

arbre["hauteur"] = 13 # modifier arbre["estVivant"] = True # ajouter une clé neuve

Si la clé existe déjà, la valeur est remplacée. Si la clé est nouvelle, la paire est créée. Python ne fait pas de différence entre les deux cas.

Supprimer une clé

del dico["clé"]

del arbre["age"] # retire la clé "age" # arbre n'a plus la clé "age"

del supprime la paire clé/valeur définitivement. Si la clé n'existe pas, Python lève une erreur KeyError - vérifier avant avec in ou utiliser .pop("age", None).

Parcourir un dictionnaire

On peut boucler sur les clés seules, les valeurs seules, ou les deux à la fois avec .items(). On peut tester si une clé est présente avec in et compter avec len.

Boucler sur les paires

.items() - .keys() - .values()

for cle, valeur in arbre.items(): print(cle, ":", valeur) for cle in arbre.keys(): print(cle) # les étiquettes for valeur in arbre.values(): print(valeur) # les données

.items() est le plus utile : il donne les deux en même temps. On utilise deux variables dans le for pour recevoir la clé et la valeur.

Tester et compter

in - len()

"espece" in arbre # True (clé présente) "couleur" in arbre # False (clé absente) len(arbre) # nombre de paires

in cherche parmi les clés uniquement, pas les valeurs. len donne le nombre de paires clé/valeur dans le dictionnaire.

Accès prudent : .get()

Quand on n'est pas sûr qu'une clé existe, dico["clé"] peut planter avec un KeyError. La méthode .get() évite ce problème en renvoyant une valeur par défaut si la clé est absente.

Lire sans risque

dico.get("clé", valeur_par_defaut)

arbre.get("hauteur", 0) # 13 (clé présente) arbre.get("couleur", "?") # "?" (clé absente) arbre["couleur"] # KeyError !

Le deuxième argument est la valeur par défaut. Si on ne le précise pas, .get() renvoie None quand la clé est absente - ce qui est déjà mieux qu'une erreur.

Comparer les deux approches

avec vérification in vs .get()

# approche 1 : vérifier avant if "hauteur" in arbre: print(arbre["hauteur"]) # approche 2 : .get() en une ligne print(arbre.get("hauteur", 0))

Les deux approches sont correctes. .get() est plus concise quand on veut seulement lire la valeur ou utiliser un défaut.

Le tableau 2D : une liste de listes

Un tableau 2D est une liste dont chaque élément est lui-même une liste. On l'imagine comme une grille avec des lignes et des colonnes. On accède à une cellule avec deux indices : [ligne][colonne].

Créer et accéder

grille[ligne][colonne]

foret = [ [3, 0, 5], [1, 4, 2], ] foret[1][2] # 2 (ligne 1, colonne 2) foret[0][0] # 3 (coin supérieur gauche)

Le premier indice choisit la ligne, le second choisit la colonne dans cette ligne. Les deux indices commencent à 0.

Modifier une cellule

grille[ligne][colonne] = valeur

foret[0][0] = 9 # modifier une cellule # foret devient [[9, 0, 5], [1, 4, 2]] foret[1] = [7, 7, 7] # remplacer une ligne

On peut modifier une cellule précise ou remplacer une ligne entière. La structure reste la même : une liste de listes.

Parcourir un tableau 2D

On utilise une double boucle : la première parcourt les lignes, la seconde parcourt les valeurs de chaque ligne. len(foret) donne le nombre de lignes, len(foret[0]) donne le nombre de colonnes.

Boucle sur les valeurs

for ligne in grille / for valeur in ligne

for ligne in foret: for valeur in ligne: print(valeur, end=" ") print() # retour à la ligne après chaque ligne

Le print() sans argument à la fin de la boucle externe crée un saut de ligne entre chaque rangée de la grille.

Boucle avec indices

range(len(grille)) / range(len(grille[0]))

nombreLignes = len(foret) nombreColonnes = len(foret[0]) for ligne in range(nombreLignes): for colonne in range(nombreColonnes): print(foret[ligne][colonne])

Utile quand on a besoin des indices en même temps que les valeurs, par exemple pour modifier des cellules selon leur position.

Tableau de synthèse : quelle structure choisir ?

Trois structures, trois usages. Le bon choix dépend de comment on repère les données : par position, par étiquette ou par ligne et colonne.

Structure On repère par Exemple concret Quand choisir ?
liste = [...] position (indice 0, 1, 2...) mesures = [21.5, 22.0, 19.8] Une suite de mesures, un ensemble de valeurs du même type
dico = {...} clé (étiquette) arbre = {"espece": "erable", "age": 40} Les attributs d'un objet ou d'un individu (l'arbre, l'étudiant, la station)
grille = [[...]] ligne et colonne carte = [[0, 1, 0], [1, 1, 0]] Une carte de la forêt, une image pixel par pixel, un tableau de données 2D

Les pièges qui font perdre du temps

Quatre erreurs très fréquentes avec les dictionnaires et les tableaux 2D.

KeyError sur une clé absente

arbre["couleur"] # KeyError ! "couleur" in arbre # verifier avant arbre.get("couleur", "?") # ou .get()

Si la clé n'existe pas dans le dictionnaire, Python plante. Utilise in pour vérifier, ou .get() avec une valeur par défaut.

L'ordre [ligne][colonne], pas l'inverse

foret[2][1] # ligne 2, colonne 1 foret[1][2] # ligne 1, colonne 2 (different !)

Le premier indice est toujours la ligne, le second la colonne. Les inverser donne une cellule complètement différente, parfois hors limites.

Confondre dict {} et liste []

mesures = {21.5, 22.0} # non : c'est un ensemble (set) mesures = [21.5, 22.0} # SyntaxError mesures = [21.5, 22.0] # liste arbre = {"espece": "erable"} # dict

Les accolades seules {} sans : créent un ensemble (set), pas un dictionnaire. Un dictionnaire exige toujours des paires clé: valeur.

Tableau 2D avec * : lignes partagées

grille = [[0] * 3] * 2 # PIEGE ! grille[0][0] = 9 # grille est [[9,0,0],[9,0,0]] les deux lignes changent # solution correcte : comprehension grille = [[0] * 3 for ligne in range(2)]

Avec [[0]*3]*2 les deux lignes pointent sur la même liste en mémoire. Modifier une cellule modifie toutes les lignes. Utilise une compréhension pour créer des listes indépendantes.