首页 > 解决方案 > 在 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。二,如果没有附加值,我想最终不创建嵌套列表。

如何为不断变化的值创建嵌套列表?

标签: tclns2

解决方案


我没有完全理解这个问题,但据我了解,您需要创建一个列表列表,其中较大的列表包含 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]]]
# {{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}}

推荐阅读