我有一个键值列表,例如:
set x {{a 1} {b 2} {c 3}}
我需要在所有子列表中提取index = 1中的所有项目以获取:
{1 2 3}
答案 0 :(得分:3)
您可以使用:
$ set y {}
$ foreach sublist $x { lappend y [lindex $sublist 1]}
$ puts $y
1 2 3
TCL 8.6或更新版的解决方案:
使用lmap
遍历x
,无需在任何地方保存值,只需一行:
$ lmap sublist $x {lindex $sublist 1}
参考文献: lmap,tcl.tk
答案 1 :(得分:1)
我使用了以下功能:
proc MapList {Var List Script} {
if {![llength $List]} {return $List}
upvar 1 $Var Item
foreach Item $List {lappend Res [uplevel 1 $Script]}
return $Res
}
并像这样使用它:
MapList Arg $x {lindex $Arg 1}
答案 2 :(得分:0)
一种解决方案是征集dict values
命令:
dict values [concat {*}{{a 1} {b 2} {c 3}}]
如何工作:dict values
收集由另一个列表中的每个其他项目(从第二个开始)组成的列表。这是用于字典,但由于字典基本上只是偶数大小的列表,它适用于任何偶数大小的列表,但有一点需要注意:如果任何键出现多次,dict values
的结果将仅包含与该键关联的最后一个值。
通过将子列表作为参数单独传递给concat
,可以轻松地将包含两项子列表的列表转换为偶数大小的列表。
另一种方法是使用其他答案中提到的方法之一遍历列表,或者可能是这样:
set res {}
for {set i 0} {$i < [llength $x]} {incr i} {
lappend res [lindex $x $i 1]
}
set res
这类似于
set res {}
foreach item $x {
lappend res [lindex $item 1]
}
set res
(或相应的lmap item $x {lindex $item 1}
)
但确实提供了以下选项:1)从索引≠0开始,2)在列表结尾之前结束,3)以两个(或更多)项目步骤遍历列表。
文档:concat,dict,for,foreach,incr,lappend,lindex,{{3 }},llength,lmap