2016-03-24 7 views
0

Я посмотрел TCL remove an element from a list, и он, похоже, не работает для меня. Часть кода, например:удалить элемент из списка списков tcl по значению

set mylist [list {a b c} {d e f} {g h i}] 

Это то, что я хочу, чтобы это произошло:

set idx [lsearch $mylist "a"];  # or if "d", it should take out {d e f} instead. Likewise, if "g" it should take out {g h i} 
set mylist [lreplace $mylist $idx $idx] 
puts "$mylist" 

Output: 
{d e f} {g h i} 

Это то, что происходит на самом деле:

Output: 
{a b c} {d e f} {g h i} 

Когда я вложится IDX, он выходит с «-1» независимо от того, что я ищу. Я знаю, что легко удалить элементы с индексом фирмы, но мне нужна программа, чтобы иметь возможность искать элементы списка, чтобы удалить его. В принципе, как мне найти индекс элемента, который я хочу удалить, только для поиска его одной части?

EDIT: Nevermind. Я понял, что вам нужно использовать * в своем поиске. Так как я не видел его где-нибудь еще здесь, я оставлю мой первоначальный вопрос, и решение, которое я нашел:

set label "a" 
set idx [lsearch $mylist $label*] 
set mylist [lreplace $mylist $idx $idx] 

Output: 
{d e f} {g h i} 
+0

Это государственный праздник в большом количестве в мире; вещи немного медленнее, чем обычно. –

+0

Ваш шаблон поиска '$ label *' означает, что вы найдете только элементы, которые * начинаются с * данной меткой. –

ответ

1

Вы всегда ищете термин поиска в первом элементе каждого подсписка? Если да, то вы можете использовать опцию -indexlsearch «s, который определяет, какая часть каждого элемента должны быть рассмотрены:

set mylist [list {a b c} {d e f} {g h i}] 
set label "a" 
set idx [lsearch -index 0 -exact $mylist $label] 
set mylist [lreplace $mylist $idx $idx] 
Смежные вопросы