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

时间:2017-10-30 06:59:58

标签: tcl

假设我有一个这样的列表:curl -X GET 'https://detail.1688.com/offer/535394058500.html?spm=b26110380.sw1688.mof001.302.6YIDM0' -H 'cache-control: no-cache' -H 'content-type: application/x-www-form-urlencoded' -H 'postman-token: 2b11da6f-dcde-d527-289c-bfbf8a85d30c' 并且我想创建一个由每个嵌套列表的第一个元素组成的新列表:String[] name = "abcd2qwer3yuiop".split("\\d+",2); System.out.println(name.length); // gives 2 System.out.println(name[0]); // gives abcd -- length=4 System.out.println(name[1]); // gives qwer3yuiop -- length=10 。我知道如何使用' foreach'在几行中做到这一点,但这是一种更优雅的方式,还是更好的内置功能呢?

3 个答案:

答案 0 :(得分:5)

如果您使用的是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 $x 0例如)。

答案 1 :(得分:1)

如您所知,您想要搜索第一个元素,这是您使用foreach的最佳解决方案。复杂性将在你的情况下O(1)。因为您只需要访问固定索引的第一个值。

答案 2 :(得分:0)

作为使用[lmap] / [lindex]的替代方法,将问题重新公式化为平坦但常规的列表。也就是说,accessing the nth (1st, 2nd, ...) element在对列表的输入列表进行展平之后:

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