加入两个列表的最佳方式是什么?

时间:2013-07-13 14:49:16

标签: tcl

我有两个包含一些数据的列表(数字数据或/和字符串)?

因此,在假设列表不包含子列表的情况下,我应该如何加入这两个列表。

首选的选择是什么?为什么?

  1. set first [concat $first $second]

  2. lappend first $second

  3. append first " $second"

3 个答案:

答案 0 :(得分:11)

使用concat很好,在某些情况下甚至是高效的(它是8.4及之前的推荐技术,在以后的版本中也不算太差)。但是,使用lappend的第二个选项根本不起作用,append的版本可以使用,但效率也非常低。

工作的其他版本:

# Strongly recommended from 8.6.1 on
set first [list {*}$first {*}$second]
lappend first {*}$second

从8.6.1开始推荐第一个这样的原因是编译器能够将其优化为直接的“列表连接”操作。

答案 1 :(得分:2)

实施例

% set first {a b c}
a b c
% set second {1 2 3}
1 2 3
% set first [concat $first $second]; # #1 is correct
a b c 1 2 3
% set first {a b c}
a b c
% lappend first $second; # #2 is wrong: appends the whole `second` list to `first
a b c {1 2 3}

讨论

我查阅了文档,还试验了一些列表并发现:

  1. 您的第一选择,concat是正确的
  2. lappend不起作用,因为它将$second视为一个元素,而不是列表
  3. append有效,但您将列表视为字符串。我不知道其含义是什么,但它没有传达firstsecond列表的意图。

答案 2 :(得分:1)

也许有点老,但想澄清一下;

如前所述,合并2个列表的标准方法是通过collapse=TRUE pre-v8.6。但请注意,concat在处理长列表时效率非常低,因为它会将列表作为合并的一部分进行分析。例如,合并列表时,它们越大,合并越慢。

两个附加都不合并“列表”,它们只是添加到现有列表(concat)或变量(lappend)。这两个附加对速度没有影响,因为它们在追加时不会分析任何内容。

如果合并单个条目列表元素,可以通过append合并它们,但仅限于处理每个列表中的简单/单个元素(即每个元素没有空格)。