Este es un truco clásico:
list = {{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}}
Module[{f},
f[x_] := (f[x] = Sequence[]; x);
Map[f, list, {2}]
]
Para entender cómo funciona, considere lo que sucede cuando f[1]
se evalúa por primera vez. f[1]
se evaluará a (f[1]=Sequence[]); 1
, luego a solo 1
. Entonces ahora se han hecho definiciones para f[1]
. La próxima vez que se evalúe f[1]
, simplemente se evaluará a Sequence[]
.
Por lo tanto, la primera vez que se evalúa un argumento para f
, devuelve ese argumento. La segunda (o tercera, etc.) vez que se evalúa, devuelve Sequence[]
. Sequence[]
tiene la propiedad de que se eliminará por completo de las expresiones, es decir, {1, Sequence[], 3}
se evaluará a {1, 3}
.
En resumen, lo que hace la función es: la primera vez que ve un elemento, reemplaza el elemento consigo mismo (lo deja solo). La segunda vez que ve el mismo elemento, lo elimina. Asigné esta función a "level 2", por lo que solo actuará sobre los elementos de las sublistas.
Bienvenido a stack exchange. Buena primera pregunta. También puede querer saber sobre el sitio de Mathematica (beta): http://mathematica.stackexchange.com/ – DavidC