从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]
策略可能会超过上述策略