从tcl中的列表列表创建第一个元素列表

从tcl中的列表列表创建第一个元素列表,tcl,Tcl,假设我有这样一个列表:{{1 2 3}{4 5 6}{7 8 9},我想创建一个由每个嵌套列表的第一个元素组成的新列表:{1 4 7}。我知道如何使用“foreach”在几行中实现这一点,但这是一种更优雅的方式,还是一个更好的内置函数来实现这一点?正如您所知,您希望搜索第一个元素,因此这是使用foreach的最佳解决方案。复杂性将在您的案例O(1)中。因为您只需要访问索引上固定的第一个值。如果您使用的是Tcl 8.6,那么有一个lmap命令可以映射列表并用于您的任务: %set a {{1 2

假设我有这样一个列表:
{{1 2 3}{4 5 6}{7 8 9}
,我想创建一个由每个嵌套列表的第一个元素组成的新列表:
{1 4 7}
。我知道如何使用“foreach”在几行中实现这一点,但这是一种更优雅的方式,还是一个更好的内置函数来实现这一点?

正如您所知,您希望搜索第一个元素,因此这是使用
foreach
的最佳解决方案。复杂性将在您的案例O(1)中。因为您只需要访问索引上固定的第一个值。

如果您使用的是Tcl 8.6,那么有一个
lmap
命令可以映射列表并用于您的任务:

%set a {{1 2 3} {4 5 6} {7 8 9}}
{1 2 3} {4 5 6} {7 8 9}
%lmap x $a {lindex $x 0}
1 4 7

lmap
命令迭代列表
$a
,将当前正在处理的列表项分配给给定变量(
x
,在示例中),并调用命令(
lindex$x0
),作为使用
[lmap]
/
[lindex]
的替代方法,将问题重新表述为一个平坦但规则的列表上的问题。也就是说,在将列表的输入列表展平后:

set a {{1 2 3} {4 5 6} {7 8 9}}
set A [concat {*}$a]; # flattened list: {1 2 3 4 5 6 7 8 9}
lmap {pick drop drop} $A {set pick}
然而,根据输入列表的布局,
[lmap]
/
[lindex]
策略可能会超过上述策略