Recherche…


Remarques

Les dictionnaires dans Tcl sont des valeurs qui contiennent un mappage de valeurs arbitraires vers d'autres valeurs arbitraires. Ils ont été introduits dans Tcl 8.5, bien qu'il y ait des versions limitées pour Tcl 8.4. Les dictionnaires sont syntaxiquement les mêmes que les listes avec des nombres pairs d'éléments; la première paire d'éléments est la première clé et la valeur du dictionnaire, la deuxième paire est le deuxième tuple.

Ainsi:

fox "quick brown" dogs "lazy"

est un dictionnaire valide. La même clé peut être plusieurs fois, mais c'est exactement comme si la valeur de ce dernier était dans la valeur précédente; ce sont le même dictionnaire:

abcd {1 2 3} defg {2 3 4} abcd {3 4 5}
abcd {3 4 5} defg {2 3 4}

Les espaces sont sans importance, tout comme les listes.

Un ordre important avec les dictionnaires est l'ordre d'itération; Les dictionnaires tentent d'utiliser l'ordre d'insertion de clé comme ordre d'itération, mais lorsque vous mettez à jour la valeur d'une clé existante, vous écrasez la valeur de cette clé. Les nouvelles clés vont à la fin.

Références: dict

Ajout de liste à un dictionnaire imbriqué

Si nous avons ce dictionnaire:

set alpha {alice {items {}} bob {items {}} claudia {items {}} derek {items {}}}

Et que vous voulez ajouter "fork" et "peanut" aux éléments d'Alice, ce code ne fonctionnera pas:

dict lappend alpha alice items fork peanut
dict get $alpha alice
# => items {} items fork peanut

Comme il est impossible pour la commande de savoir où les clés de clés se terminent et les valeurs à ajouter à la liste, la commande est limitée à un seul jeton de clé.

La manière correcte d’ajouter au dictionnaire interne est la suivante:

dict with alpha alice {
    lappend items fork peanut
}
dict get $alpha alice
# => items {fork peanut}

Cela fonctionne parce que la commande dict with permet de traverser des dictionnaires imbriqués, autant de niveaux que le nombre de clés que nous fournissons. Il crée ensuite des variables portant les mêmes noms que les clés de ce niveau (une seule ici: items ). Les variables sont initialisées à la valeur de l'élément correspondant dans le dictionnaire. Si nous modifions la valeur, cette valeur modifiée est utilisée pour mettre à jour la valeur de l'élément du dictionnaire à la fin du script.

(Notez que les variables continuent à exister lorsque la commande est terminée.)

Utilisation de base d'un dictionnaire

Créer un dictionnaire:

set mydict [dict create a 1 b 2 c 3 d 4]
dict get $mydict b ; # returns 2
set key c
set myval [dict get $mydict $key]
puts $myval
# remove a value
dict unset mydict b
# set a new value
dict set mydict e 5

Les clés de dictionnaire peuvent être imbriquées.

dict set mycars mustang color green
dict set mycars mustang horsepower 500
dict set mycars prius-c color orange
dict set mycars prius-c horsepower 99
set car [dict get $mycars mustang]
# $car is: color green horsepower 500
dict for {car cardetails} $mycars {
  puts $car
  dict for {key value} $cardetails {
    puts "  $key: $value"
  }
}

La commande dict get peut générer une erreur

set alpha {a 1 b 2 c 3}
dict get $alpha b
# => 2
dict get $alpha d
# (ERROR) key "d" not known in dictionary

Si dict get est utilisé pour récupérer la valeur d'une clé manquante, une erreur est générée. Pour éviter l'erreur, utilisez dict exists :

if {[dict exists $alpha $key]} {
    set result [dict get $alpha $key]
} else {
    # code to deal with missing key
}

Comment gérer une clé manquante dépend bien sûr de la situation: une manière simple consiste à définir le result sur une valeur par défaut "vide".

Si le code ne tente jamais de récupérer d'autres clés qui se trouvent dans le dictionnaire, il est dict get n'échouera pas. Mais pour des clés arbitraires, dict get est une opération qui doit être surveillée. De préférence, en testant avec dict exists , bien que la capture d’exceptions fonctionnera aussi.

Itérer sur un dictionnaire

Vous pouvez parcourir le contenu d'un dictionnaire avec dict for , ce qui est similaire à foreach :

set theDict {abcd {ab cd} bcde {ef gh} cdef {ij kl}}
dict for {theKey theValue} $theDict {
    puts "$theKey -> $theValue"
}

Cela produit cette sortie:

abcd -> ab cd
bcde -> ef gh
cdef -> ij kl

Vous obtiendrez la même sortie en utilisant les dict keys pour lister les clés et les itérer par dessus:

foreach theKey [dict keys $theDict] {
    set theValue [dict get $theDict $theKey]
    puts "$theKey -> $theValue"
}

Mais le dict for est plus efficace.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow