2011-04-18 57 views
18

TE如何从TCL列表中删除元件说:TCL从列表中删除元件

  1. 具有索引= 4
  2. 具有值= “AA”

我已经Google搜索并且还没有找到任何内置功能。

回答

34
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 
+0

这是伟大的,但我的名单由来自子列表打电话,我想在每个子表,如果检查第二个索引中的值为0(例如),我想删除该子列表。我应该怎么做。附:问题是[lindex $ list]返回的值不是参考 – Narek 2011-04-18 11:27:54

+5

@Narek然后请更新您的问题,问问你想要什么,B/C drysdam回答了你问的问题。 – 2011-04-18 12:20:31

+0

请将[lreplace $ idx $ idx]更改为[lreplace $ mylist $ idx $ idx]。 – Narek 2011-05-11 05:10:14

4

比方说,你要替换元素 “B”:

% set L {a b c d} 
a b c d 

您可以通过任何更换第一器件和最后一个元素1:

% lreplace $L 1 1 
a c d 
15

另一种删除元素的方法是将其过滤掉。这种Tcl 8.5技术不同于其他地方提到的方法,因为它从列表中删除给定元素的全部

set stripped [lsearch -inline -all -not -exact $inputList $elemToRemove] 

它没有做的是通过嵌套列表进行搜索。这是Tcl没有努力深入理解您的数据结构的结果。 (你可以告诉它通过比较虽然子列表中的具体内容进行搜索,通过-index选项。)

1

regsub也可以适用于从列表中删除值。

set mylist {a b c} 
puts $mylist 
    a b c 

regsub b $mylist "" mylist 

puts $mylist 
    a c 
llength $mylist 
    2 
0

刚刚结束了别人怎么做

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