9

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

假设列表不包含子列表,我如何加入这两个列表?

哪个选择是首选,为什么?

  1. set first [concat $first $second]

  2. lappend first $second

  3. append first " $second"

4

3 回答 3

17

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

其他可行版本:

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

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

于 2013-07-14T05:57:12.373 回答
3

例子

% 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有效,但您将列表视为字符串。我不知道这意味着什么,但它并没有传达出清单的first意图second
于 2013-07-13T22:19:45.857 回答
1

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

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

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

如果合并单个条目列表元素,可以通过set first [join [lappend first $second]]但仅在处理每个列表中的简单/单个元素时合并它们(即每个元素没有空格)。

于 2016-06-10T18:31:10.587 回答