我有两个包含一些数据的列表(数字数据或/和字符串)?
因此,在假设列表不包含子列表的情况下,我应该如何加入这两个列表。
首选的选择是什么?为什么?
set first [concat $first $second]
lappend first $second
append first " $second"
答案 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}
我查阅了文档,还试验了一些列表并发现:
concat
是正确的lappend
不起作用,因为它将$second
视为一个元素,而不是列表append
有效,但您将列表视为字符串。我不知道其含义是什么,但它没有传达first
和second
列表的意图。答案 2 :(得分:1)
也许有点老,但想澄清一下;
如前所述,合并2个列表的标准方法是通过collapse=TRUE
pre-v8.6。但请注意,concat
在处理长列表时效率非常低,因为它会将列表作为合并的一部分进行分析。例如,合并列表时,它们越大,合并越慢。
两个附加都不合并“列表”,它们只是添加到现有列表(concat
)或变量(lappend
)。这两个附加对速度没有影响,因为它们在追加时不会分析任何内容。
如果合并单个条目列表元素,可以通过append
合并它们,但仅限于处理每个列表中的简单/单个元素(即每个元素没有空格)。