我想动态地将元素添加到嵌套列表中。请考虑以下示例:
set super_list {}
lappend super_list {00 01 02}
lappend super_list {10 11 12}
lappend super_list {20 21}
结果:
super_list = {00 01 02} {10 11 12} {20 21}
[lindex $super_list 0] = {00 01 02}
[lindex $super_list 1] = {10 11 12}
[lindex $super_list 2] = {20 21}
如何将另一个值(例如22)附加到[lindex $ super_list 2]?
lappend [lindex $super_list 2] 22
不起作用!
到目前为止,我能想到的唯一解决方法是:
lset super_list 2 [concat [lindex $super_list 2] {22}]
这真的是唯一的方法吗?
谢谢, 莱纳斯
答案 0 :(得分:3)
在Tcl 8.6中(添加了该功能;它在早期版本中不起作用),您可以使用lset
通过索引end+1
扩展嵌套列表:
set super_list {{00 01 02} {10 11 12} {20 21}}
lset super_list 2 end+1 22
puts [lindex $super_list 2]
# ==> 20 21 22
您也可以通过使用数字索引来解决一个问题,但我认为end+1
更为谨慎。
答案 1 :(得分:2)
列表没有直接的方法来执行此操作。你至少可以在proc中包装它:
proc sub_lappend {listname idx args} {
upvar 1 $listname l
set subl [lindex $l $idx]
lappend subl {*}$args
lset l $idx $subl
}
sub_lappend super_list 2 22 23 24
{00 01 02} {10 11 12} {20 21 22 23 24}
这种方法的优点是您可以传递索引列表以在任意嵌套列表中工作(如lset
):
% sub_lappend super_list {0 0} 00a 00b 00c
{{00 00a 00b 00c} 01 02} {10 11 12} {20 21 22 23 24}