List 如何从tcl中的列表中删除列表

List 如何从tcl中的列表中删除列表,list,tcl,List,Tcl,我有两张单子 集合a1{abcdef} 集合b1{b f e} 我正在尝试从列表中删除\u$a1$b1>{acd} 是否有一个函数可以在tcl上的列表上操作?首先,不能将括号用于列表文本。括号用于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 没有从一个列表中减去另一个列表的标准命令。不过,构造一个过滤器非常容易 您可以通过lmap(列

我有两张单子

  • 集合a1{abcdef}
  • 集合b1{b f e}
我正在尝试从列表中删除\u
$a1$b1>{acd}


是否有一个函数可以在tcl上的列表上操作?

首先,不能将括号用于列表文本。括号用于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
没有从一个列表中减去另一个列表的标准命令。不过,构造一个过滤器非常容易

您可以通过
lmap
(列表映射)过滤器过滤掉
a1
b1
中的项目:

lmap
正文中的
if
命令确定项目是否不在(
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
文件: , , , , , , , ,
您也可以使用数组。添加和删除元素很容易

% 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
#使用tcllib中的struct::set

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。
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