使用列表中成员的值作为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

我是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 $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
中的其他变量)。