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

SIM*_*MEL 2 tcl

是否有一个命令可以让我获得两个列表的交集(两个列表中的成员)?

例如,如果列表是:

a b c d hc e f g h

结果应该是 c h

RHS*_*ger 7

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

:: struct :: set intersect?set1 ......?

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
Run Code Online (Sandbox Code Playgroud)


And*_*ong 5

没有命令,但是通常这样做的方法是在构造一个或多个列表时缓存元素,以节省时间。例如,给出以下内容:

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

foreach y {c e f g h} {
    lappend list_y $y
}
Run Code Online (Sandbox Code Playgroud)

我会补充:

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
Run Code Online (Sandbox Code Playgroud)

输出:

c h
Run Code Online (Sandbox Code Playgroud)