Вот версия ответа Робертсона, которая использует 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]] &]