删除名单上有两个列表如何从列表中TCL
- 集合A1 {ABCDEF}
- 集B1 {BFE}
我试图做remove_from_list $a1 $b1 >> {a c d}
有没有可以在tcl上的列表上运行的函数?
删除名单上有两个列表如何从列表中TCL
我试图做remove_from_list $a1 $b1 >> {a c d}
有没有可以在tcl上的列表上运行的函数?
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
删除首先,你不能使用括号名单文字。括号用于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
是在b1
由lmap
(列表地图)的过滤项:
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
文档: continue, foreach, if, lappend, list, lmap (for Tcl 8.5), lmap, ni (operator), set
您也可以使用数组。这很容易添加和删除元素
% 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设置
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
请解释你在这里做了什么,为什么选择struct :: set。 –
的当然是这种限制很难有多个具有相同值的元素(没有问题)。 –