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

发布于 2021-01-29 14:56:39

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

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))]

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

关注者
0
被浏览
75
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这个有点棘手。您想从冻结的计数器中删除字典,但是计数器在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]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看