如何从TCL列表中删除一个元素,比如:
- 索引为4的元素
- 值为"aa"的元素
我已经使用谷歌搜索了,并没有找到任何内置函数可以实现。
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
选项通过比较子列表的特定元素来告诉它进行搜索。)
% 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
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
有两种简单的方法。
# index
set mylist "a c b"
set mylist [lreplace $mylist 2 2]
puts $mylist
a b
# value
set idx [lsearch $mylist "b"]
set mylist [lreplace $mylist $idx $idx]
puts $mylist
a
a
而应该是a c
? - Andrew Barber