2017-09-16 85 views
1

删除名单上有两个列表如何从列表中TCL

  • 集合A1 {ABCDEF}
  • 集B1 {BFE}

我试图做remove_from_list $a1 $b1 >> {a c d}

有没有可以在tcl上的列表上运行的函数?

回答

0
   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

删除首先,你不能使用括号名单文字。括号用于Tcl中的命令替换。

相反,使用列表制作命令,list

% set a1 [list a b c d e f] 
a b c d e f 

或者,或多或少等价:

% set b1 {b f e} 
b f e 

没有标准的命令从另一个减去一个列表。但是,构建过滤器非常简单。

可以滤除a1是在b1lmap(列表地图)的过滤项:

lmap item $a1 { 
    if {$item ni $b1} { 
     set item 
    } else { 
     continue 
    } 
} 

# results in 
a c d 

lmap体内部的if命令,用于确定某个产品不在ni$b1。如果这是真的,则该项目的值将成为结果的一部分。如果它是假的,则该项目被跳过。

在Tcl 8.5和更早的版本中,没有lmap。在这种情况下,您可以将ersatz lmap(工作原理)复制并粘贴到以下代码:链接中。

或者,也可以用foreach代替。这是一个有点混乱,但工程。

set res {} 
foreach item $a1 { 
    if {$item ni $b1} { 
     lappend res $item 
    } 
} 

% set res 
a c d 

文档: continueforeachiflappendlistlmap (for Tcl 8.5)lmapni (operator)set

3

您也可以使用数组。这很容易添加和删除元素

% foreach elem $a1 {set x($elem) 1} 
% foreach elem $b1 {unset x($elem)} 
% set result [array names x] 
d a c 

这也是一个非常有效的方法,只有一次通过每个列表。

或者使用字典保持原有的插入顺序:

% foreach elem $a1 {dict set y $elem 1} 
% foreach elem $b1 {dict unset y $elem} 
% set result [dict keys $y] 
a c d 
+2

的当然是这种限制很难有多个具有相同值的元素(没有问题)。 –

1

#与结构::从tcllib设置

package require struct::set 
set a1 {a b c d e f} 
set b1 {b f e} 
struct::set difference $a1 $b1 

# result in 
d a c 

Dokumentation: struct::set

+0

请解释你在这里做了什么,为什么选择struct :: set。 –