在Python列表中删除重复的字典

发布于 2021-02-02 23:16:04

有一个字典列表,我想删除具有相同键和值对的字典。

对于此列表: [{'a': 123}, {'b': 123}, {'a': 123}]

我想退掉这个: [{'a': 123}, {'b': 123}]

另一个例子:

对于此列表: [{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}, {'a': 123, 'b': 1234}]

我想退掉这个: [{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}]

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

    尝试这个:

    [dict(t) for t in {tuple(d.items()) for d in l}]
    

    该策略是将字典列表转换为元组列表,其中元组包含字典项。由于可以对元组进行散列,因此你可以使用删除重复项set(在这里使用set comprehension,这将是更老的python替代品set(tuple(d.items()) for d in l)),然后,使用来从元组中重新创建字典dict。

    哪里:

    • l 是原始清单
    • d 是列表中的词典之一
    • t 是从字典创建的元组之一

    编辑:如果要保留订单,则上面的单行将不起作用,因为set不会这样做。但是,通过几行代码,你也可以做到这一点:

    l = [{'a': 123, 'b': 1234},
            {'a': 3222, 'b': 1234},
            {'a': 123, 'b': 1234}]
    
    seen = set()
    new_l = []
    for d in l:
        t = tuple(d.items())
        if t not in seen:
            seen.add(t)
            new_l.append(d)
    
    print new_l
    

    输出示例:

    [{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}]
    

    注意:正如@a​​lexis指出的那样,两个具有相同键和值的字典可能不会产生相同的元组。如果他们经历了不同的添加/删除密钥历史记录,则可能会发生这种情况。如果是你的问题,请考虑d.items()按照他的建议进行排序。



知识点
面圈网VIP题库

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

去下载看看