在tcl中查找两个列表的交集

在tcl中查找两个列表的交集,tcl,Tcl,是否有一个命令允许我获取两个列表的交集(在两个列表中均为apear的成员) 例如,如果列表为: a b c d h和c e f g h 结果应该是ch没有命令,但通常我这样做的方式是在构建一个或多个列表期间缓存元素,以节省时间。例如,考虑到以下情况: foreach x {a b c d h} { lappend list_x $x } foreach y {c e f g h} { lappend list_y $y } 我想补充: foreach x {a b c d h

是否有一个命令允许我获取两个列表的交集(在两个列表中均为apear的成员)

例如,如果列表为:

a b c d h
c e f g h


结果应该是
ch

没有命令,但通常我这样做的方式是在构建一个或多个列表期间缓存元素,以节省时间。例如,考虑到以下情况:

foreach x {a b c d h} {
    lappend list_x $x
}

foreach y {c e f g h} {
    lappend list_y $y
}
我想补充:

foreach x {a b c d h} {
    lappend list_x $x
    set cache($x) 1
}

foreach y {c e f g h} {
    lappend list_y $y
    if {[info exists cache($y)]} {
        lappend list_xy $y
    }
}

puts $list_xy
输出:

c h

假设您真正拥有的是一个集合(具有唯一元素的列表),您可以使用tcllib:


在常规的Tcl中似乎没有任何东西,但是TclX有一个交集函数。从8.5开始,这应该是非常快的(如果放在一个过程中)。
package require Tcl 8.5
set a {1 2 3 4 5}
set b {3 4 5 6 7}
set intersect [list]

foreach elem $a {
    if {$elem in $b} {
        lappend intersect $elem
    }
}
package require Tcl 8.0
package require struct::set

set list1 {a b c d h}
set list2 {c e f g h}
::struct::set intersect $list1 $list2
> c h