5

我想动态地将元素添加到嵌套列表中。考虑以下示例:

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}]

这真的是唯一的方法吗?

谢谢,莱纳斯

4

2 回答 2

4

在 Tcl 8.6 中(该功能已添加;它在早期版本中不起作用)您可以使用lset通过 index 扩展嵌套列表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更容易记忆。

于 2013-07-30T14:46:37.740 回答
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}

这种方法的一个优点是您可以传递一个索引列表以在任意嵌套列表中工作(如lset):

% sub_lappend super_list {0 0} 00a 00b 00c
{{00 00a 00b 00c} 01 02} {10 11 12} {20 21 22 23 24}
于 2013-07-30T14:19:08.130 回答