这是罗伯逊答案的一个版本,它使用 100%“后缀表示法”进行函数调用。
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#Where
类似于 MMA Select
,而 C#Select
类似于 MMA Map
。
编辑:添加了可选的测试函数参数,默认为SameQ
.
编辑:这是一个版本,它解决了我在下面的评论并报告给定投影仪函数的组中的所有等价物,该投影仪函数产生一个值,如果值相等,则列表的元素被认为是等价的。这实质上会找到比给定大小更长的等价类:
reportDuplicateClusters[list_List, projector_: (# &),
minimumClusterSize_: 2] :=
GatherBy[list, projector] //
Select[#, Length@# >= minimumClusterSize &] &
这是一个检查整数对的第一个元素的示例,如果它们的第一个元素相等,则认为两对相等
reportDuplicateClusters[RandomInteger[10, {10, 2}], #[[1]] &]