これは、関数呼び出しに100%「後置表記」を使用するRobertsonの回答のバージョンです。
identifyDuplicates[list_List, test_:SameQ] :=
list //
Tally[#, test] & //
Select[#, #[[2]] > 1 &] & //
Map[#[[1]] &, #] &
Mathematica の//
ドットは、他の言語のメソッド呼び出しのドットに似ています。たとえば、これを C# / LINQ スタイルで記述すると、次のようになります。
list.Tally(test).Where(x => x[2] > 1).Select(x => x[1])
C# は MMA に似ており、C# は MMA に似Where
ていることに注意してください。Select
Select
Map
編集: オプションのテスト関数引数を追加しました。デフォルトはSameQ
です。
EDIT:これは、以下の私のコメントに対処し、値が等しい場合にリストの要素が同等と見なされるような値を生成するプロジェクター関数を指定して、グループ内のすべての同等物を報告するバージョンです。これは基本的に、指定されたサイズよりも長い等価クラスを見つけます。
reportDuplicateClusters[list_List, projector_: (# &),
minimumClusterSize_: 2] :=
GatherBy[list, projector] //
Select[#, Length@# >= minimumClusterSize &] &
最初の要素が等しい場合に 2 つのペアが等しいと見なして、最初の要素で整数のペアをチェックするサンプルを次に示します。
reportDuplicateClusters[RandomInteger[10, {10, 2}], #[[1]] &]