DeleteDuplicates同时保留子列表结构

sta*_*ael 7 filtering wolfram-mathematica list

我想从列表列表中删除重复数据删除,保持子列表结构不变.

例如

{{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}}

{{1, 7, 8}, {4, 3}, {9}, {2}}

这是嵌套的范围,空的子列表是可以的.

Sza*_*lcs 11

这是一个经典的伎俩:

list = {{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}}

Module[{f},
 f[x_] := (f[x] = Sequence[]; x);
 Map[f, list, {2}]
]
Run Code Online (Sandbox Code Playgroud)

要了解它是如何工作的,请考虑f[1]第一次评估时会发生什么. f[1]将评估(f[1]=Sequence[]); 1,然后评估1.所以现在已经做出了定义f[1].下一次f[1]评估时,它将简单地评估为Sequence[].

因此,第一次f评估参数时,它返回该参数.它被评估的第二个(或第三个等)时间返回Sequence[]. Sequence[]具有完全剥离表达式的属性,{1, Sequence[], 3}即将评估为{1, 3}.

总而言之,该函数的作用是:第一次看到一个元素时,它会将元素替换为自身(单独留下).第二次它看到相同的元素,它会删除它.我将此函数映射到" 级别2 ",因此它仅对子列表的元素起作用.