Buscar..


Observaciones

Los diccionarios en Tcl son valores que contienen una asignación de valores arbitrarios a otros valores arbitrarios. Fueron introducidos en Tcl 8.5, aunque hay versiones limitadas para (ahora sin soporte) Tcl 8.4. Los diccionarios son sintácticamente lo mismo que las listas con un número par de elementos; el primer par de elementos es la primera clave y el valor del diccionario, el segundo par es la segunda tupla.

Así:

fox "quick brown" dogs "lazy"

Es un diccionario válido. La misma clave puede ser varias veces, pero es exactamente como si el valor de este último estuviera en el valor anterior; estos son el mismo diccionario:

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

El espacio en blanco no es importante, al igual que con las listas.

Un concepto importante con los diccionarios es el orden de iteración; los diccionarios intentan usar el orden de inserción de claves como su orden de iteración, aunque cuando actualiza el valor de una clave que ya existe, sobrescribe el valor de esa clave. Nuevas llaves van al final.

Referencias: dict

Lista-anexando a un diccionario anidado

Si tenemos este diccionario:

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

Y desea agregar "fork" y "peanut" a los artículos de Alice, este código no funcionará:

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

Debido a que sería imposible para el comando saber dónde terminan los tokens de clave y los valores que se deben agregar al inicio de la lista, el comando se limita a un token de clave.

La forma correcta de adjuntar al diccionario interno es esta:

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

Esto funciona porque el comando dict with comando nos permite atravesar diccionarios anidados, tantos niveles como la cantidad de tokens clave que proporcionamos. Luego crea variables con los mismos nombres que las claves en ese nivel (solo una aquí: items ). Las variables se inicializan al valor del elemento correspondiente en el diccionario. Si cambiamos el valor, ese valor modificado se usa para actualizar el valor del elemento del diccionario cuando finaliza el script.

(Tenga en cuenta que las variables continúan existiendo cuando el comando ha finalizado).

Uso básico de un diccionario.

Creando un diccionario:

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

Las claves del diccionario se pueden anidar.

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

El comando dict get puede provocar un error.

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 se usa dict get para recuperar el valor de una clave faltante, se genera un error. Para evitar el error, use dict exists :

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

Cómo manejar una clave faltante, por supuesto, depende de la situación: una forma simple es establecer el result en un valor "vacío" predeterminado.

Si el código nunca intenta recuperar otras claves que están en el diccionario, no dict get producirá un error en la dict get del dictado. Pero para claves arbitrarias, dict get es una operación que debe ser protegida. Preferiblemente, al probar con dict exists , aunque la captura de excepciones también funcionará.

Iterando sobre un diccionario

Puede recorrer el contenido de un diccionario con dict for , que es similar a foreach :

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

Esto produce esta salida:

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

Obtendría la misma salida usando las dict keys para listar las teclas e iterando sobre eso:

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

Pero dict for es más eficiente.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow