TCL удалить элемент из списка
Как удалить элемент из списка TCL сказать:
- , который имеет индекс = 4
- который имеет значение = "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