Поиск…


замечания

Словари в 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 более эффективен.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow