我有两个列表
我正在尝试执行remove_from_list $a1 $b1 >> {a c d}
是否有可以对tcl上的列表进行操作的函数?
答案 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
(列表地图)过滤器过滤掉b1
中lmap
项中的项目:
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
文档: continue, foreach, if, lappend, list, lmap (for Tcl 8.5), lmap, ni (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