Я не могу придумать автоматическую команду, но вы могли бы сделать что-то вроде следующего:
set result {}
set index 0
foreach key [lsort -integer [array keys dn]] {
lappend result [incr index] $db($key)
}
array set newDn $result
Или, если у вас 8.6 и tcllib AND, вы жаждете наказания, но развлекаетесь:
set index 0
array set newDn [struct::list flatten \
[::struct::list mapfor x \
[dict values [lsort -stride 2 -integer [array get dn]]] \
{list [incr index] $x}]]
Хотя я бы сказал, что за первой версией немного легче следовать:)
Если бы в tcllib struct :: list была команда zip, она, вероятно, была бы намного чище, поскольку вы могли бы сжать отсортированные (по ключам) значения с помощью йота 1-n.