【问题标题】:How to deduplicate dictionary in Python? Is there any method to override hashCode of some class like Java? [duplicate]如何在 Python 中对字典进行重复数据删除?是否有任何方法可以覆盖 Java 等某些类的 hashCode? [复制]
【发布时间】:2021-10-16 04:42:29
【问题描述】:
elements = [
{'a' : 1, 'b' : 2, 'c': 3},
{'a' : 2, 'b' : 2, 'c': 3},
{'a' : 2, 'b' : 3, 'c': 3},
{'a' : 1, 'b' : 2, 'c': 3},
{'a' : 2, 'b' : 2, 'c': 3},
{'a' : 2, 'b' : 2},
{'a' : 1, 'b' : 2, 'c': 3, 'd' : 4},
{'v' : [1,2,3]}
]

鉴于以上listdict在Python中,如何去重复到以下集合(顺序无关有效

result = [
{'a' : 1, 'b' : 2, 'c': 3},
{'a' : 2, 'b' : 2, 'c': 3},
{'a' : 2, 'b' : 3, 'c': 3},
{'a' : 2, 'b' : 2},
{'a' : 1, 'b' : 2, 'c': 3, 'd' : 4},
{'v' : [1,2,3]}
]

最简单的方法是使用set,但是在Python 中dict 是不可散列的。现在,我的解决方案是将dict 序列化为String,如json 格式(因为dict 没有顺序,两个不同的字符串可以对应同一个字典。我必须保持一些顺序)。但是这种方法时间复杂度太高。

我的问题:

  1. 如何在 Python 中高效地对字典进行去重?

  2. 更一般地说,是否有任何方法可以覆盖类的 hashCode,如 Java 以使用 setdict

【问题讨论】:

标签: python python-3.x dictionary hash


【解决方案1】:

对于您的玩具示例,您可以使用内部字典的repr 作为新字典的键,然后收集所有值:

elements = [{'a' : 1, 'b' : 2, 'c': 3},             {'a' : 2, 'b' : 2, 'c': 3},
            {'a' : 2, 'b' : 3, 'c': 3},             {'a' : 1, 'b' : 2, 'c': 3},
            {'a' : 2, 'b' : 2, 'c': 3},             {'a' : 2, 'b' : 2},
            {'a' : 1, 'b' : 2, 'c': 3, 'd' : 4},    {'v' : [1,2,3]}]

kv = {repr(inner):inner for inner in elements}
elements = list(kv.values())

print(elements)

输出:

[{'a': 1, 'b': 2, 'c': 3}, {'a': 2, 'b': 2, 'c': 3}, {'a': 2, 'b': 3, 'c': 3}, 
 {'a': 2, 'b': 2}, {'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'v': [1, 2, 3]}]

如果您检查内部词典的id(),您会看到最后一个幸存下来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 2012-12-03
    • 2021-12-21
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2011-04-24
    • 2015-05-02
    相关资源
    最近更新 更多