小编典典

从列表中有效删除与订单无关的重复项

python

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

l1 = [
    ['The', 'quick', 'brown', 'fox'],
    ['hi', 'there'],
    ['jumps', 'over', 'the', 'lazy', 'dog'],
    ['there', 'hi'],
    ['jumps', 'dog', 'over','lazy', 'the'],
]

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

l1 = [
    ['The', 'quick', 'brown', 'fox'],
    ['hi', 'there'],
    ['jumps', 'over', 'the', 'lazy', 'dog'],
]

我尝试过了:

[list(i) for i in set(map(tuple, l1))]

但是,我不知道这是否是处理大型列表的最快方法,而且我的尝试没有按预期进行。关于如何有效删除它们的任何想法?


阅读 285

收藏
2021-01-20

共1个答案

小编典典

这个有点棘手。您想从冻结的计数器中删除字典,但是计数器在Python中不可哈希。为了使渐进复杂度稍有下降,可以使用已排序的元组代替冻结计数器:

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

单线的相同想法如下所示:

[*{tuple(sorted(k)): k for k in reversed(l1)}.values()][::-1]
2021-01-20