如何删除TCL列表中的元素:
我使用Google搜索并且还没有找到任何内置功能。</ p>
答案 0 :(得分:42)
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
答案 1 :(得分:16)
删除元素的另一种方法是将其过滤掉。此Tcl 8.5技术与其他地方提到的lsearch
&amp; lreplace
方法的不同之处在于它从列表中删除了给定元素的 all 。
set stripped [lsearch -inline -all -not -exact $inputList $elemToRemove]
它不做的是搜索嵌套列表。这是Tcl没有过多努力深入理解您的数据结构的结果。 (您可以通过-index
选项比较子列表的特定元素来告诉它进行搜索。)
答案 2 :(得分:4)
假设你想要替换元素“b”:
% set L {a b c d}
a b c d
您替换第一个元素1和最后一个元素1:
% lreplace $L 1 1
a c d
答案 3 :(得分:1)
regsub
也可能适合从列表中删除值。
set mylist {a b c}
puts $mylist
a b c
regsub b $mylist "" mylist
puts $mylist
a c
llength $mylist
2
答案 4 :(得分:1)
刚刚完成了其他人的工作
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
答案 5 :(得分:1)
您也可以这样尝试:
set i 0
set myl [list a b c d e f]
foreach el $myl {
if {$el in {a b e f}} {
set myl [lreplace $myl $i $i]
} else {
incr i
}
}
set myl