从列表列表中有效地删除重复项,与顺序无关

ano*_*non 5 python list-comprehension list unordered python-3.x

下面的列表有一些重复的子列表,元素的顺序不同:

l1 = [
    ['The', 'quick', 'brown', 'fox'],
    ['hi', 'there'],
    ['jumps', 'over', 'the', 'lazy', 'dog'],
    ['there', 'hi'],
    ['jumps', 'dog', 'over','lazy', 'the'],
]
Run Code Online (Sandbox Code Playgroud)

如何删除重复项,保留看到的第一个实例,以获得:

l1 = [
    ['The', 'quick', 'brown', 'fox'],
    ['hi', 'there'],
    ['jumps', 'over', 'the', 'lazy', 'dog'],
]
Run Code Online (Sandbox Code Playgroud)

我试过了:

[list(i) for i in set(map(tuple, l1))]
Run Code Online (Sandbox Code Playgroud)

尽管如此,我不知道这是否是大型列表的最快方法,而且我的尝试没有按预期工作。知道如何有效地删除它们吗?

wim*_*wim 5

这个有点棘手。您想从冻结的计数器中键入一个 dict,但计数器在 Python 中不可散列。对于渐近复杂性的小幅下降,您可以使用排序元组作为冻结计数器的替代品:

seen = set()
result = []
for x in l1:
    key = tuple(sorted(x))
    if key not in seen:
        result.append(x)
        seen.add(key)
Run Code Online (Sandbox Code Playgroud)

单行中的相同想法如下所示:

[*{tuple(sorted(k)): k for k in reversed(l1)}.values()][::-1]
Run Code Online (Sandbox Code Playgroud)