Как te удалить элемент из списка TCL, скажите:
- который имеет индекс = 4
- который имеет value = "aa"
У меня есть Googled и еще нет встроенной функции.
Как te удалить элемент из списка TCL, скажите:
У меня есть Googled и еще нет встроенной функции.
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 не слишком усложняет понимание ваших структур данных. (Вы можете сказать это, чтобы искать, сравнивая отдельные элементы подписок, но используя опцию -index
.)
Предположим, вы хотите заменить элемент "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