我有两个包含一些数据(数字数据或/和字符串)的列表?
假设列表不包含子列表,我如何加入这两个列表?
哪个选择是首选,为什么?
set first [concat $first $second]
lappend first $second
append first " $second"
我有两个包含一些数据(数字数据或/和字符串)的列表?
假设列表不包含子列表,我如何加入这两个列表?
哪个选择是首选,为什么?
set first [concat $first $second]
lappend first $second
append first " $second"
它很好用concat
,在某些情况下甚至效率很高(这是 8.4 及之前的推荐技术,在以后的版本中也不错)。但是,您的第二个选项lappend
根本不起作用,并且版本append
会起作用,但效率也会非常低。
其他可行的版本:
# Strongly recommended from 8.6.1 on
set first [list {*}$first {*}$second]
lappend first {*}$second
从 8.6.1 开始推荐第一个的原因是编译器能够将其优化为直接的“列表连接”操作。
% 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 个列表的标准方法是通过concat
v8.6 之前的版本。但是请注意,concat
在处理长列表时效率非常低,因为它将列表作为合并的一部分进行分析。例如,在合并列表时,它们越大,合并越慢。
两个追加都不会合并“列表”,它们只是添加到现有列表 ( lappend
) 或变量 ( append
)。两个追加都对速度没有影响,因为它们在追加时不分析任何内容。
如果合并单个条目列表元素,可以通过set first [join [lappend first $second]]
但仅在处理每个列表中的简单/单个元素时合并它们(即每个元素没有空格)。