2 つのリストの共通部分 (両方のリストに表示されるメンバー) を取得できるコマンドはありますか?
たとえば、リストが次の場合:
a b c d h
とc e f g h
結果はc h
実際に持っているものがセット(一意の要素を持つリスト)であると仮定すると、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
コマンドはありませんが、通常、これを行う方法は、時間を節約するために、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
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
}
}