Подтвердить что ты не робот

TCL удалить элемент из списка

Как te удалить элемент из списка TCL, скажите:

  • который имеет индекс = 4
  • который имеет value = "aa"

У меня есть Googled и еще нет встроенной функции.

4b9b3361

Ответ 1

set mylist {a b c}
puts $mylist
a b c

Удалить по индексу

set mylist [lreplace $mylist 2 2]
puts $mylist 
a b

Удалить по значению

set idx [lsearch $mylist "b"]
set mylist [lreplace $mylist $idx $idx]
puts $mylist
a

Ответ 2

Другой способ удалить элемент - это отфильтровать его. Этот метод Tcl 8.5 отличается от метода lsearch & lreplace, упомянутого в другом месте, поскольку он удаляет все данные из списка.

set stripped [lsearch -inline -all -not -exact $inputList $elemToRemove]

То, что он не делает, это поиск по вложенным спискам. Это следствие того, что Tcl не слишком усложняет понимание ваших структур данных. (Вы можете сказать это, чтобы искать, сравнивая отдельные элементы подписок, но используя опцию -index.)

Ответ 3

Предположим, вы хотите заменить элемент "b":

% set L {a b c d}
a b c d

Вы заменяете первый элемент 1 и последний элемент 1 ничем:

% lreplace $L 1 1
a c d

Ответ 4

regsub также может быть подходящим для удаления значения из списка.

set mylist {a b c}
puts $mylist
  a b c

regsub b $mylist "" mylist

puts $mylist
  a  c
llength $mylist
  2

Ответ 5

Просто обернуто то, что сделали другие.

proc _lremove {listName val {byval false}} {
    upvar $listName list

    if {$byval} {
        set list [lsearch -all -inline -not $list $val]
    } else {
        set list [lreplace $list $val $val]
    }

    return $list
}

Затем вызовите с помощью

Inline edit, list lappend
    set output [list 1 2 3 20]
    _lremove output 0
    echo $output
    >> 2 3 20

Set output like lreplace/lsearch
    set output [list 1 2 3 20]
    echo [_lremove output 0]
    >> 2 3 20

Remove by value
    set output [list 1 2 3 20]
    echo [_lremove output 3 true]
    >> 1 2 20

Remove by value with wildcar
    set output [list 1 2 3 20]
    echo [_lremove output "2*" true]
    >> 1 3