Tcl / Tk: как мне добавить или вставить во вложенный список? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть два списка - каждый из которых содержит вложенные списки - которые я хочу объединить в третий список.

Когда я пытаюсь использовать 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, я получаю "плохой индекс"error:

% 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 голосов
/ 06 декабря 2018

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, но иногда это не приводит к конкатату списков (по сложным причинам обратной совместимости).

0 голосов
/ 06 декабря 2018

с linsert вы бы написали:

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

Мы указываем, что мы хотим вставить в конец первого элемента списка1, элементы первого элемента list2

0 голосов
/ 06 декабря 2018

Команда lappend принимает в качестве первого аргумента имя переменной списка.Вы передаете ему имя {abc}.

Вы можете использовать команду 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 {
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...