Ricerca…


Osservazioni

I dizionari in Tcl sono valori che contengono una mappatura da valori arbitrari ad altri valori arbitrari. Sono stati introdotti in Tcl 8.5, sebbene ci siano versioni limitate per (ora non supportate) Tcl 8.4. I dizionari sono sintatticamente gli stessi delle liste con numeri pari di elementi; la prima coppia di elementi è la prima chiave e il valore del dizionario, la seconda coppia è la seconda tupla.

Così:

fox "quick brown" dogs "lazy"

è un dizionario valido La stessa chiave può essere più volte, ma è esattamente come se il valore di quest'ultimo fosse nel valore precedente; questi sono lo stesso dizionario:

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

Lo spazio bianco non è importante, proprio come con le liste.

Un concetto importante con i dizionari è l'ordine di iterazione; i dizionari cercano di utilizzare l'ordine di inserimento della chiave come ordine di iterazione, sebbene quando si aggiorna il valore di una chiave già esistente, si sovrascrive il valore di tale chiave. Nuove chiavi vanno alla fine.

Riferimenti: dict

Elenco: accodato ad un dizionario annidato

Se abbiamo questo dizionario:

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

E vuoi aggiungere "fork" e "peanut" agli oggetti di Alice, questo codice non funzionerà:

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

Perché sarebbe impossibile per il comando sapere dove finiscono i token delle chiavi e iniziare i valori da aggiungere alla lista, il comando è limitato a un token di chiave.

Il modo corretto per aggiungere al dizionario interno è questo:

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

Funziona perché il comando dict with comando ci consente di attraversare i dizionari nidificati, con molti livelli quanti sono i token chiave che forniamo. Quindi crea variabili con gli stessi nomi delle chiavi su quel livello (solo una qui: items ). Le variabili sono inizializzate sul valore dell'elemento corrispondente nel dizionario. Se modifichiamo il valore, quel valore modificato viene utilizzato per aggiornare il valore dell'elemento del dizionario al termine dello script.

(Si noti che le variabili continuano a esistere quando il comando è terminato).

Uso di base di un dizionario

Creare un dizionario:

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

Le chiavi del dizionario possono essere annidate.

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"
  }
}

Il comando dict get può generare un errore

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

Se dict get viene utilizzato per recuperare il valore di una chiave mancante, viene generato un errore. Per prevenire l'errore, utilizzare dict exists :

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

Come gestire una chiave mancante ovviamente dipende dalla situazione: un modo semplice è di impostare il result su un valore "vuoto" predefinito.

Se il codice non tenta mai di recuperare altre chiavi che si trovano nel dizionario, il dict get will ovviamente non fallirà. Ma per le chiavi arbitrarie, il comando dict get è un'operazione che deve essere sorvegliata. Preferibilmente testando con dict exists , anche se funzionerà anche l'eccezione catching.

Iterare su un dizionario

Puoi scorrere il contenuto di un dizionario con dict for , che è simile a foreach :

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

Questo produce questo risultato:

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

Otterresti lo stesso risultato usando i dict keys per elencare i tasti e scorrere su quello:

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

Ma dict for è più efficiente.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow