Arrays TCL中的数组处理

Arrays TCL中的数组处理,arrays,tcl,Arrays,Tcl,我有一个数组(TCL中的hashmap),因此命令parraydn产生以下结果 dn(1) = 52638515 dn(11) = 324009 dn(12) = 257949 dn(13) = 298844 dn(14) = 442499 dn(15) = 417333

我有一个数组(TCL中的hashmap),因此命令parraydn产生以下结果

                 dn(1)  = 52638515
                 dn(11) = 324009
                 dn(12) = 257949
                 dn(13) = 298844
                 dn(14) = 442499
                 dn(15) = 417333
                 dn(2)  = 49807360
                 dn(3)  = 52848230
                 dn(4)  = 39845888
                 dn(5)  = 26633830 

所以我想将它设置为另一个数组,从1开始到长度(dn)。。我在dn中有几个条目,如上面的数据,它们之间缺少索引。tcl中是否有任何内置的数组命令可以做到这一点?

我想不出一个自动命令,但您可以执行以下操作:

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,你贪图惩罚,却贪图娱乐:

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命令,它可能会更干净,因为您可以使用iota 1-n压缩已排序(按键)的值。

我想不出自动命令,但您可以执行以下操作:

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,你贪图惩罚,却贪图娱乐:

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命令,它可能会更干净,因为您可以使用iota 1-n压缩排序(按键)的值