获取特定索引列表中的项目

时间:2015-05-27 12:13:03

标签: list tcl

我有一个键值列表,例如:

set x {{a 1} {b 2} {c 3}}

我需要在所有子列表中提取index = 1中的所有项目以获取:

{1 2 3}

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)以两个(或更多)项目步骤遍历列表。

文档:concatdictforforeachincrlappendlindex,{{3 }},llengthlmap