Это классический трюк:
list = {{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}}
Module[{f},
f[x_] := (f[x] = Sequence[]; x);
Map[f, list, {2}]
]
Чтобы понять, как это работает, рассмотрим, что происходит, когда f[1]
оценивается впервые.f[1]
оценивается как (f[1]=Sequence[]); 1
, а затем просто 1
.Так что теперь определения были сделаны для f[1]
.В следующий раз, когда f[1]
оценивается, он просто оценивается как Sequence[]
.
Итак, в первый раз f
оценивается для аргумента, он возвращает этот аргумент.Во второй (или третий и т. Д.) Раз он оценивается, возвращается Sequence[]
.Sequence[]
обладает свойством, что он будет полностью удален из выражений, то есть {1, Sequence[], 3}
будет иметь значение {1, 3}
.
Подводя итог, что функция делает: в первый раз, когда она видит элемент,он заменяет элемент на себя (оставляет его в покое).Во второй раз он видит тот же элемент, он удаляет его.Я отобразил эту функцию на « level 2 », поэтому она будет действовать только на элементы подсписков.