dict

 

La commande "dict" existe à partir de la version 8.5 de Tcl.

Cette commande permet de créer des dictionnaires, sortes de tableaux associatifs (array) sans nom, mais avec des fonctionnalités supplémentaires. Dans sa version "humaine", un dictionnaire apparaît comme une liste clé-valeur "k1 v1 k2 v2 k3 v3 ...". Attention, l'ordre des couples clé-valeur n'a aucun sens particulier : "k1 v1 k2 v2 k3 v3" et "k2 v2 k1 v1 k3 v3" correspondent au même dictionnaire.

Création d'un dictionnaire :

 set le_dico [dict create k1 v1 k2 v2 k3 v3]

Faute de dictionnaire, on aurait dû créer un tableau au moyen de la commande

 array set le_tableau {k1 v1 k2 v2 k3 v3}

Récupération de la valeur "v2" associée à la clé "k2" :

 puts [dict get $le_dico k2]   ;# -> v2

Ajout de la clé k4 associée à la valeur v4 dans le dictionnaire :

 dict set le_dico k4 v4        ;# k1 v1 k2 v2 k3 v3 k4 v4

Modification le la valeur associée à la clé k3 :

 dict set le_dico k3 v3n       ;# k1 v1 k2 v2 k3 v3n k4 v4

Suppression de la clé k2 (et de sa valeur associée)

 dict unset le_dico k2        ;# k1 v1 k3 v3n k4 v4

Liste des clés

 puts [dict keys $le_dico]    ;# -> k1 k3 k4
 puts [dict keys $le_dico *3] ;# -> k3

Une valeur-liste

 dict lappend k5 v5           ;# k1 v1 k3 v3n k4 v4 k5 v5
 dict lappend k5 v5a v5b      ;# k1 v1 k3 v3n k4 v4 k5 {v5 v5a v5b}

Si une procédure doit accéder à un dictionnaire sans le modifier, on peut passer sa valeur. Avec un tableau, il faut toujours passer le nom :

 proc get_val_dico {dico k} {return [dict get $dico $k]}
 proc get_val_array {arrayName k} {upvar $arrayName array; return $array($k)}

 puts [get_val_dico $le_dico k3]     ;# -> v3n
 puts [get_val_array le_tableau k3]  ;# -> v3

ulis, 19-02-05. Quelles nouvelles fonctionnalités apporte le dictionnaire par rapport à array ? Pour l'instant je n'en ai vu qu'une seule : la possibilité de le passer par valeur. Ce qui me semble bien maigre pour un nouveau type de données (dont la syntaxe est plus lourde).

GS C'est une structure de donnée à cheval entre list et array. Par rapport à array, elle a le mérite de conserver l'ordre dans lequel on déclare le tableau associatif. Ce qui n'est pas le cas quand on souhaite récupérer les données avec array get.

ulis, 20-02-05. Juste par curiosité, que faut-il comprendre sur l'ordre des clés ?

En début de cette page : "k1 v1 k2 v2 k3 v3" et "k2 v2 k1 v1 k3 v3" correspondent au même dictionnaire"

Juste ci-dessus : "elle a le mérite de conserver l'ordre dans lequel on déclare le tableau associatif"

FP, 2005-02-20. Je suis désaccord avec GS. Un dictionnaire n'a aucune notion d'ordre, contrairement à une liste. Pour s'en convaincre, il suffit de jouer avec "dict set ..." et "dict unset ...". Un exemple (non nécessairement reproductible) :

 dict set d k0 v0    ;# k0 v0
 dict set d k1 v1    ;# k1 v1 k0 v0
 dict set d k2 v2    ;# k1 v1 k2 v2 k0 v0

GS (050221) Mea culpa! En effet, la notion d'ordre n'est pas fondée avec dict.

ulis, 21-02-05. Bon et alors quelles sont les fonctionnalités supplémentaires (cf. "sortes de tableaux associatifs (array) sans nom, mais avec des fonctionnalités supplémentaires) ? (toujours cette satanée curiosité)

Miko Moi qui suis un peu limité, j'utilise peu array. Je suis vite perdu, alors que les commandes de dict me semblent plus facile à appréhender... Affaire de goût, car je sens confusément que l'usage de l'un ou de l'autre s'adapte aux même cas, non?

FP, 2005-02-24. Il y a au moins une fonctionnalité de plus : "dict filter ...". Mais bon, à part le passage par valeur, qui allège l'écriture des programmes, la vrai raison de dict, c'est les fonctionnalités en moins qui rendent moins gourmande (en mémoire et vitesse) l'exécution du programme. Cf. TIP#111 [1].


Catégorie Manuel Tcl/Tk