La problématique

Nous avons réussi à avoir une douzaine d'algoblobs en mouvement. Mais pour cela, il nous a fallu créer autant de listes qu'il y avait de caractéristiques. Une liste pour les abscisses, une liste pour les ordonnées, etc. Cette approche a été efficace mais elle porte en germe un certain nombre de problème

Nos algoblobs sont différents. On peut imaginer que certains vont avoir une caractéristique et pas d'autres. Par exemple, certains algoblobs vont pulser, avec une frequence de pulsation. Cette caractéristique, si on la stocke dans une liste, va exister pour certains et pour pas d'autres.

Il existe une solution qui réside dans l'utilisation des dictionnaires.

Un dictionnaire

Un vieux dictionnaire

Pour les précurseurs des algoblobs, comme le professeur CHOM, un dictionnaire est un objet du siècle passé dans lequel on cherchait la définition des mots. C'est ce principe qui est important : à un mot (la clef de recherche) est associé sa définition (la valeur dans le dictionnaire). En informatique, on va avoir le même principe. Un dictionnaire, comme une liste, est un ensemble de données. Mais au lieu d'être accessible par un indice numérique, elles sont accessibles au moyen d'une clef.

Imaginons que l'on veuille stocker les informations des produit d'un magasin de meuble. Pour chaque meuble, on pourra stocker les dimensions (hauteur, largeur, profondeur), le poids, le nombre de pièces, la couleur, le nom, la présence en rayon (le client peut le prendre seul ou il doit passer au stock). Ces informations peuvent être stocké dans un dictionnaire. Voyons concrêtement comment on fait cela avec Python.

Un dictionnaire en Python
Créer le dictionnaire

Il existe deux méthodes pour créer un dictionnaire. La première utilise la fonction dict. La seconde est d'utiliser la notation avec les accolades

#première méthode
monDico = dict()

# sedonde méthode
modDico2 = {}
Ajouter ou modifier des éléments

Pour ajouter ou modifier un élément, on va utiliser comme pour les listes la notation entre crochet. Au lieu d'avoir l'indice numérique de la position de l'élérment entre les crochets, on aura la clef

# On crée une entrée dans le dictionnaire
monDico['prix'] = 560
# La clef prix est maintenant associé à une valeur. 
# On peut la modifier. C'est les soldes !
monDico['prix'] = 500

Il y a aussi une possibilité de donner des valeurs directement à la création du dictionnaire

monDico = {'prix': 560, 'poids': 50, 'couleur' : 'blanc', 'enRayon' : True}

On peut d'ailleurs, dans la déclaration d'un dictionnaire, aller à la ligne pour avoir des choses plus lisibles

monDico = {'prix': 560,
    'poids': 50, 
    'couleur' : 'blanc', 
    'enRayon' : True}
Accéder à un élément du dictionnaire

La aussi, simplement, il suffit d'utiliser la notation entre crochet

print("Le prix de ce meuble est de  ",str(monDico['prix])," euros")
Supprimer un élément du dictionnaire

Pour supprimer un élément du dictionnaire, on utilise la fonction del. Le code suivant va supprimer le couple clef/valeur associé au poids de monDico :

del(monDico['poids']) 
Parcourir le dictionnaire

Comme une liste, un dictionnaire peut être parcouru grâce à une boucle avec for et in. Dans ce cas là, ce sont les clefs qui sont parcourues

Essayez le code suivant

monDico = { 'nom' : "CHOM", 'prenom' : "Monsieur le professeur", 'courriel' : "chom@sky.com" } for clef in monDico : print(clef, end=" : ") print(monDico[clef])

Notez bien que l'on a pas de guillemets autour de clef dans monDico[clef]. C'est tout à fait normal. clef est une variable qui prendra successivement les valeurs 'nom', 'prenom' et 'courriel'

  • Un dictionnaire est une structure de données indexée par des clefs
  • On crée un dictionnaire avec monDico = dict() ou monDico={}
  • On peut alimenter le dictionnaire à la création
  • On accéde aux dictionnaire pour lire, écrire ou modifier grâce aux crochets : monDico[clef]

Un dictionnaire pour réunir nos algoblobs

Les algoblobs étaient tout écartelés dans l'espace du programmes, et leurs âmes éparpillées risquaient le pire : la disparition par le bug. Alors j'ai consigné chacun d'eux dans un livre, leur livre. Leur dictionnaire. Et chacun a retrouvé son unité.

in Interview du professeur CHOM par Nora SKITTEL

Notre plus gros problème était d'avoir des algoblobs répartis entre différentes listes. Désormais, nous allons avoir une seule liste, chaque élément de cette liste étant étant un dictionnaire qui contient les informations sur un algoblob.

Chaque algoblob sera défini par un dictionnaire. Notez que pour les clefs, vous pouvez prendre un nom plus court, il n'y a pas de risque de collision avec d'autres parties du programme. Par exemple, nous pouvons nommer l'ascisse simplement x. Ce sera bien l'abscisse de l'algoblob, puisque cette information est dans son dictionnaire. Voici une façon de déclarer un algoblob si l'on utilise un dictionnaire et que les valeurs sont tirées aléatoirement :

bob = { 'x' : uniform(0,largeur),
        'y' : uniform(0,hauteur),
        'vx' : uniform(-5,5),
        'vy' : uniform(-5,5),
        'r' : uniform(10,30)
}    

Si l'on veut créer tous nos algoblobs dans une boucle, on utilisera une liste vide, puis avec append, on ajoutera les dictionnaires un par un.

  1. Reprenez votre dernier programme sur les algoblobs et ouvrez le dans l'éditeur Python que vous utilisez
  2. Enregistrez le sous un nouveau nom (par exemple dictionnaire.py)
  3. modifiez le pour que les algoblobs soient crées avec des dictionnaires. Vous devez modifier la partie de la création, mais aussi l'éxécution
  4. Testez et savourez votre programme