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

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

  1. , который имеет индекс = 4
  2. который имеет значение = "aa"

я погуглил и еще не нашел встроенной функции.

5 ответов


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

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

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

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


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

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

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

% lreplace $L 1 1
a c d

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

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

regsub b $mylist "" mylist

puts $mylist
  a  c
llength $mylist
  2

просто завернул то, что другие сделали

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