2

2 つのリストの共通部分 (両方のリストに表示されるメンバー) を取得できるコマンドはありますか?

たとえば、リストが次の場合:

a b c d hc e f g h

結果はc h

4

3 に答える 3

7

実際に持っているものがセット(一意の要素を持つリスト)であると仮定すると、tcllibを使用できます。

:: struct :: set cross?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
于 2012-08-20T02:47:48.820 に答える
6

コマンドはありませんが、通常、これを行う方法は、時間を節約するために、1 つまたは複数のリストの構築中に要素をキャッシュすることです。たとえば、次のようになります。

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
于 2012-08-19T15:32:03.050 に答える
2
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
    }
}
于 2012-08-19T15:53:12.613 に答える