tcl - 在 TCL 中动态创建嵌套列表
问题描述
在 NS2 中使用 Tcl,我试图根据项目总数创建嵌套列表。例如,我有 20 个项目,因此我需要在一个allLists {}
列表中创建 20 个列表,稍后我可以添加某些值来使用类似puts "[lindex $allLists 0 2]"
. 下面是我的代码:
for {set i 0} {$i < $val(nn)} {incr i} {
set allClusters {
set nodeCluster [lindex $allClusters $i] {}
}
}
puts "$allClusters"
puts "Node Cluster 0: [lindex $nodeCluster 0]"
我的预期输出将是 20 个空白列表和 nodeCluster 0 的另外 1 个:
{}
{}
{}
...
Node Cluster 0: {}
相反,我将其作为引用项目:
set nodeCluster [lindex $allClusters $i] {}
一,我不想手动设置嵌套列表,因为以后我会在里面有 100 个列表$allLists
。二,如果没有附加值,我想最终不创建嵌套列表。
如何为不断变化的值创建嵌套列表?
解决方案
我没有完全理解这个问题,但据我了解,您需要创建一个列表列表,其中较大的列表包含 20 个较小的列表。你也许可以使用这样的东西:
set allClusters [list]
set subClusters [list]
for {set i 0} {$i < 20} {incr i} {
lappend subClusters [list]
}
lappend allClusters $subClusters
puts $allClusters
# {{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}}
$allClusters
是一个包含 20 个较小列表的列表。
如果您想在索引 2 处为较小的列表设置一个值,则必须先提取较小的列表,然后提取lappend
它,然后将其放回:
set subCluster [lindex $allClusters 0 2]
lappend subCluster "test"
lset allClusters 0 2 $subCluster
您可以创建一个proc
来执行上述操作:
proc deepLappend {clusterName indices value} {
upvar $clusterName cluster
set subCluster [lindex $cluster {*}$indices]
lappend subCluster $value
lset cluster {*}$indices $subCluster
}
deepLappend allClusters {0 2} "test"
deepLappend allClusters {0 2} "test"
puts $allClusters
# {{} {} {test test} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}}
虽然如果您正在创建一组空列表,您可以尝试使用lrepeat
:
set allClusters [list [lrepeat 20 [list]]]
# {{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}}