为了对列表的每个元素进行操作,返回修改后的列表,各种语言都有显式的构造。

在Perl中有地图:

perl -e 'my @a = (1..4); print join(q( ), map { $_ * $_ } @a)'
1 4 9 16


在Python中,存在列表推导:

>>> a = (1,2,3,4)
>>> [el*el for el in a]
[1, 4, 9, 16]


在Tcl中最有效的方法是什么?
我可以提出通常的foreach循环。

set l {}
foreach i {1 2 3 4} {
    lappend l [expr $i * $i]
}
puts $l
1 4 9 16


这是最快的方法吗?

关于内存效率,这一步一步建立了第二个列表。如果我不需要永久列表,是否有更有效的方法?

最后,还有更短的内容吗?
我在这里或http://wiki.tcl.tk中找不到信息

回答:

正如Donal Fellows回答的那样,最重要的是用于速度测试,应该将它们包装在proc {}中,因为Tcl可以进行优化。对于Tcl,将讨论“地图”功能作为将来的增强功能。有了这个提示并进一步搜索,我发现了http://wiki.tcl.tk/12848

最佳答案

最有效的方法是这样的:

set idx 0
foreach item $theList {
    lset theList $idx [expr {$item * $item}]
    incr idx
}


如果列表很短(例如几百个元素),分配新列表的成本却很小,因此您可以使用以下(简单)版本:

foreach item $theList {
    lappend newList [expr {$item * $item}]
}


请注意,foreach命令仅在放在过程(或lambda表达式或方法)中时才快速,而表达式仅在放在{大括号}中时才快速。另外,不要猜测,不要测量:注意使用time命令来找出代码的速度。

08-26 11:35