Arrays TCL中的数组处理
我有一个数组(TCL中的hashmap),因此命令parraydn产生以下结果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
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压缩排序(按键)的值