从列表中删除重复列表

the*_*may 2 python python-3.x

首先让我承认之前已经提出这个问题,但答案似乎过时或不满意.问题是一个未排序列表的列表,我们如何以最有效和优雅的方式删除重复项?(即使用最短的语法与最快的计算时间)

例:

鉴于[[1,2,3],[],[2,-2],[3,2,1]],我们想要[[1,2,3],[],[2,-2]].需要注意的是不论[1,2,3][3,2,1]无所谓.

daw*_*awg 5

你可以做:

>>> li=[[1,2,3],[],[2,-2],[3,2,1]]
>>> {frozenset(e) for e in li}
{frozenset({1, 2, 3}), frozenset({2, -2}), frozenset()}
>>> [list(x) for x in {frozenset(e) for e in li}]
[[1, 2, 3], [2, -2], []]
Run Code Online (Sandbox Code Playgroud)

关键是要使用,frozenset因为一套不可清洗.请注意,此方法可能会更改订单.

如果您想保持相同的订单,您可以:

>>> seen=set()
>>> [e for e in li if frozenset(e) not in seen and not seen.add(frozenset(e))]
[[1, 2, 3], [], [2, -2]]
Run Code Online (Sandbox Code Playgroud)

如果有重复的元素的可能性的子列表,你可以在子列表排序,使用的是一个表示:

li=[[1,2,3],[],[2,-2],[3,2,1],[1,1,2,2,3],[1,2,1,2,3]]
seen=set()
nli=[]
for e in li:
    re=repr(sorted(e))
    if re not in seen:
        seen.add(re)
        nli.append(e)

>>> nli
[[1, 2, 3], [], [2, -2], [1, 1, 2, 2, 3]]
Run Code Online (Sandbox Code Playgroud)

(注意:您可以tuple改为使用或repr根据需要使用.或者生成可散列的不可变结果)