Questo è un trucco classico:
list = {{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}}
Module[{f},
f[x_] := (f[x] = Sequence[]; x);
Map[f, list, {2}]
]
Per capire come funziona, si consideri cosa succede quando f[1]
viene valutata per la prima volta. f[1]
valuterà a (f[1]=Sequence[]); 1
, quindi a solo 1
. Quindi ora sono state fatte delle definizioni per f[1]
. La prossima volta che viene valutato f[1]
, verrà semplicemente valutato su Sequence[]
.
Quindi, la prima volta che f
viene valutata per un argomento, restituisce quell'argomento. Il secondo (o terzo, ecc.) Tempo viene valutato, restituisce Sequence[]
. Sequence[]
ha la proprietà che verrà completamente rimosso dalle espressioni, ovvero {1, Sequence[], 3}
verrà valutato su {1, 3}
.
Per riassumere, ciò che fa la funzione è: la prima volta che vede un elemento, sostituisce l'elemento con se stesso (lo lascia da solo). La seconda volta che vede lo stesso elemento, lo rimuove. Ho mappato questa funzione a "level 2", quindi agirà solo sugli elementi delle sottoliste.
Benvenuti nello stack exchange. Bella prima domanda. Potresti anche voler conoscere il sito di Mathematica (beta): http://mathematica.stackexchange.com/ – DavidC