2013-07-30 66 views
4

我想动态添加元素到嵌套列表。考虑下面的例子:将元素添加到TCL中的嵌套列表

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 2 super_list]?

lappend [lindex $super_list 2] 22 

不起作用!

我能想到的迄今唯一的解决方法是:

lset super_list 2 [concat [lindex $super_list 2] {22}] 

这真的是唯一的出路?

感谢, 莱纳斯

回答

2

有对名单做这个没有直接的方法。你至少可以把它包起来在一个进程:

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} 

这种方法的一个advatange是你可以通过索引列表工作在任意嵌套列表(如lset):

% sub_lappend super_list {0 0} 00a 00b 00c 
{{00 00a 00b 00c} 01 02} {10 11 12} {20 21 22 23 24} 
+1

8.6中有一个直接的方法;在8.5和8.4中应该使用你描述的方法。在8.4之前......它变得非常复杂...... _ –

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更具助记性。