如何从tcl

时间:2017-09-16 16:26:26

标签: list tcl

我有两个列表

  • 设置a1 {a b c d e f}
  • 设置b1 {b f e}

我正在尝试执行remove_from_list $a1 $b1 >> {a c d}

是否有可以对tcl上的列表进行操作的函数?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

首先,您不能使用括号作为列表文字。括号在Tcl中用于命令替换。

相反,请使用list-making命令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

if正文中的lmap命令确定某项是否不在ni$b1中。如果这是真的,则项的值将成为结果的一部分。如果为false,则跳过该项目。

在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

答案 2 :(得分:1)

#with struct :: set from 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