Tcl / Tk:如何追加或插入嵌套列表?

时间:2018-12-05 23:19:47

标签: list tcl

我有两个列表-每个列表都包含嵌套列表-我想合并为第三个列表。

当我尝试如下使用lappend时,新列表仅包含第二个列表中的元素,而第一个列表中没有元素。

% set list1 {{a b c} {d e f} {g h i}}
{a b c} {d e f} {g h i}
% set list2 {j k l} {m n o} {p q r}}
extra characters after close-brace
% set list2 {{j k l} {m n o} {p q r}}
{j k l} {m n o} {p q r}
% set list3 [lappend [lindex $list1 0] [lindex $list2 0]]
{j k l}

我希望这会回来

{a b c j k l}

类似地,当我尝试使用linsert时,出现“错误索引”错误:

% set list3 [linsert [lindex $list1 0] [lindex $list2 0]]
bad index "j k l": must be integer?[+-]integer? or end?[+-]integer?

有什么想法吗?

理想情况下,我想获取我的两个列表,并遍历每个嵌套列表,以便产生输出

{a b c j k l} {d e f m n o} {g h i p q r}

3 个答案:

答案 0 :(得分:1)

lappend命令将列表变量名称作为其第一个参数。 您正在为它传递名称{a b c}。

您可以使用concat命令将两个列表连接在一起以创建 一个列表。

set list3 [concat [lindex $list1 0] [lindex $list2 0]]

或使用list和扩展名创建一个新列表:

set list3 [list {*}[lindex $list1 0] {*}[lindex $list2 0]]

要遍历列表,可以使用:

foreach {item1} $list1 {item2} $list2 {
   ...
}

答案 1 :(得分:0)

Tcl 8.6的操作可让您lappend 一个元素直接进入嵌套列表:

lset theListVariable $index end+1 $theItemToAdd

例如(交互式会话):

% set lst {a b c d}
a b c d
% lset lst 1 end+1 e
a {b e} c d
% lset lst 1 end+1 f
a {b e f} c d

这意味着我们将像这样进行您的整体操作:

set list3 $list1
set index 0
foreach sublist $list2 {
    foreach item $sublist {
        lset list3 $index end+1 $item
    }
    incr index
}

或者更有可能通过串联:

set list3 [lmap a $list1 b $list2 {
   list {*}$a {*}$b
}]

使用list扩展所有参数的确会列出串联。您可以改用concat,但有时并不会列出concat(出于复杂的向后兼容性原因)。

答案 2 :(得分:0)

使用linsert,您会写:

set joined [linsert [lindex $list1 0] end {*}[lindex $list2 0]]  ;# => a b c j k l

我们指定要在list1第一个元素的 end 处插入list2第一个元素的