2013-07-30 88 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更具助記性。