Поиск…
замечания
Словари в Tcl - это значения, которые содержат сопоставление произвольных значений с другими произвольными значениями. Они были представлены в Tcl 8.5, хотя существуют ограниченные версии для (теперь неподдерживаемых) Tcl 8.4. Словари синтаксически совпадают с списками с четным числом элементов; первая пара элементов - это первый ключ и значение словаря, вторая пара - второй кортеж.
Таким образом:
fox "quick brown" dogs "lazy"
является допустимым словарем. Один и тот же ключ может быть несколько раз, но он точно так же, как если бы значение последнего находилось в значении предыдущего; это тот же словарь:
abcd {1 2 3} defg {2 3 4} abcd {3 4 5}
abcd {3 4 5} defg {2 3 4}
Пробелы несущественны, как и списки.
Важная концепция со словарями - порядок итераций; словари пытаются использовать порядок ввода ключей в качестве своего итерационного порядка, хотя, обновляя значение для уже существующего ключа, вы перезаписываете значение этого ключа. Новые клавиши идут в конец.
Ссылки: dict
Список-добавление к вложенному словарю
Если у нас есть этот словарь:
set alpha {alice {items {}} bob {items {}} claudia {items {}} derek {items {}}}
И хотите добавить «fork» и «peanut» к предметам Алисы, этот код не будет работать:
dict lappend alpha alice items fork peanut
dict get $alpha alice
# => items {} items fork peanut
Поскольку команде было бы невозможно узнать, где заканчиваются токены ключей, а значения, которые будут запущены в список, будут ограничены одним ключевым токеном.
Правильный способ добавления к внутреннему словарю:
dict with alpha alice {
lappend items fork peanut
}
dict get $alpha alice
# => items {fork peanut}
Это работает, потому что команда dict with позволяет нам пересекать вложенные словари, как и многие уровни, как количество ключевых токенов, которые мы предоставляем. Затем он создает переменные с теми же именами, что и ключи на этом уровне (только один здесь: items ). Переменные инициализируются значением соответствующего элемента в словаре. Если мы изменим значение, это измененное значение используется для обновления значения словаря при завершении скрипта.
(Обратите внимание, что переменные продолжают существовать, когда команда завершена.)
Основное использование словаря
Создание словаря:
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
Словарные ключи могут быть вложенными.
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"
}
}
Команда dict get может вызвать ошибку
set alpha {a 1 b 2 c 3}
dict get $alpha b
# => 2
dict get $alpha d
# (ERROR) key "d" not known in dictionary
Если для получения значения отсутствующего ключа используется dict get , возникает ошибка. Чтобы предотвратить ошибку, используйте dict exists :
if {[dict exists $alpha $key]} {
set result [dict get $alpha $key]
} else {
# code to deal with missing key
}
Разумеется, как справиться с недостающим ключом зависит от ситуации: один простой способ - установить для result значение «пустое» по умолчанию.
Если код никогда не пытается извлечь другие ключи, находящиеся в словаре, конечно, dict get will, конечно, не dict get . Но для произвольных ключей dict get - это операция, которую нужно охранять. Предпочтительно, тестирование с помощью dict exists , хотя исключение ловушки тоже будет работать.
Итерация по словарю
Вы можете перебирать содержимое словаря с помощью dict for , который аналогичен foreach :
set theDict {abcd {ab cd} bcde {ef gh} cdef {ij kl}}
dict for {theKey theValue} $theDict {
puts "$theKey -> $theValue"
}
Это производит этот вывод:
abcd -> ab cd bcde -> ef gh cdef -> ij kl
Вы получите тот же результат, используя dict keys чтобы перечислить ключи и повторить их:
foreach theKey [dict keys $theDict] {
set theValue [dict get $theDict $theKey]
puts "$theKey -> $theValue"
}
Но dict for более эффективен.