TCL从列表中删除元素

时间:2011-04-18 11:06:39

标签: list element tcl

如何删除TCL列表中的元素:

  1. ,其索引= 4
  2. ,其值为“aa”
  3. 我使用Google搜索并且还没有找到任何内置功能。<​​/ p>

6 个答案:

答案 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