使用列表中成员的值作为Tcl中另一个列表的键
我是Tcl的新手。我想使用列表中的元素值作为另一个列表的键。 因此,如果我有:使用列表中成员的值作为Tcl中另一个列表的键,tcl,Tcl,我是Tcl的新手。我想使用列表中的元素值作为另一个列表的键。 因此,如果我有: set mainlist { list1 list2 } set list1 { val1 val2 } set list1 { val3 val4 } 我想迭代mainlist成员以获得list1和list2成员 我尝试了以下操作,但没有成功: for {set i 0} {$i < [llength $list1]} {incr i} { set mem [lindex $list
set mainlist { list1 list2 }
set list1 { val1 val2 }
set list1 { val3 val4 }
我想迭代mainlist成员以获得list1和list2成员
我尝试了以下操作,但没有成功:
for {set i 0} {$i < [llength $list1]} {incr i} {
set mem [lindex $list1 $i]
for {set j 0} {$j < [llength $mem]} {incr j} {
puts [lindex $mem $j]
}
}
对于{set i 0}{$i<[llength$list1]}{incr i}{
set mem[lindex$list1$i]
对于{set j 0}{$j<[llength$mem]}{incr j}{
看跌期权[lindex$mem$j]
}
}
有什么解决办法吗?我认为没有必要使用“for”命令。 您可以使用以下命令:
set mainlist { list1 list2 }
set list1_mem [lindex $mainlist 0]
foreach val1 $list1_mem {
puts $val1
}
set list2_mem [lindex $mainlist 1]
foreach val2 $list2_mem {
puts $val2
}
我正在使用TCL 8.4,在以后的版本中有更多的优化方法。嗯,间接变量访问。为此使用
set
您的代码可以是:
set mainlist { list1 list2 }
set list1 { val1 val2 }
set list2 { val3 val4 }
foreach mem $mainlist {
foreach val [set $mem] {
puts $val
}
}
为什么不使用嵌套列表
编辑:使用
$mem
,其值分别为list1
或list2
。但是您试图访问变量list1
的内容,因此必须使用set varname
或set$variable\u和\uuu varname
foreach
不仅更快,而且更清楚您的意图。有关更多信息,请参阅。我也不太确定您的要求,但从您所做的循环来看,您似乎想做如下操作:
set list1 {key1 value1}
set list2 {key2 value2}
set mainlist [list $list1 $list2]
请注意,在将变量放入列表之前,需要设置这些变量
现在,如果您有键key2
,要获得值value2
,您可以使用您所做的循环,但有点不同:
set key "key2"
foreach i $mainlist {
if {[lindex $i 0] == $key} {
puts [lindex $i 1]
}
}
第一部分没有意义。您的意思是您有这样的数据结构:
set mainlist{{val1 val2}{val3 val4}
?是的,但我还需要$list1和$list2字符串。这就是为什么我需要间接访问。谢谢,这似乎有效。你能详细解释一下,为什么我的代码不正确?我使用lindex
的原因是为了确保按照指定的顺序迭代成员。你们的也能保证吗?是的。而且速度也更快。如果您需要索引,我建议在使用$mem
时使用incr
@Majid,您指的是list1
(字符串),而不是变量$list1
。代码引用变量$list1
的原因是使用set
调用变量;在这里,Johannes使用[set$mem]
返回变量$list1
(以及$mainlist
中的其他变量)。