使用set对Python字典列表去重报错,求原因及高效解决方案
为什么用set()处理字典列表会报错?高效去重方法是什么?
错误原因
Python的set()要求元素必须是**可哈希(hashable)**类型,而字典(dict)是可变(mutable)类型——可变类型的哈希值会随着内部内容的修改而变化,不符合集合对元素哈希值稳定的要求,因此直接将字典传入set()会抛出TypeError: unhashable type: 'dict'。
简单来说:集合需要元素能被唯一标识且不可变,而字典做不到这一点。
字典列表去重的标准高效方法
针对Python 3.11(3.7+版本都适用,因为3.7+字典默认保持插入顺序),推荐以下几种高效方案:
1. 基于集合的去重(无序)
将字典转换为可哈希的tuple(把字典的键值对排序后转成元组,避免键顺序不同导致误判),利用集合自动去重,再转回字典:
data = [ {"platform": "web", "id": 1}, {"platform": "web", "id": 1}, {"platform": "app", "id": 2} ] # 转换为有序元组去重,再转回字典 unique_tuples = {tuple(sorted(d.items())) for d in data} unique_data = [dict(t) for t in unique_tuples] print(unique_data)
如果能确保所有字典的键顺序完全一致(比如都是先platform后id),可以省略sorted(),进一步提升效率:
unique_tuples = {tuple(d.items()) for d in data} unique_data = [dict(t) for t in unique_tuples]
2. 保留原顺序的去重
如果需要保留原列表中元素第一次出现的顺序,可以用字典推导式(Python 3.7+字典有序),将可哈希的元组作为键,字典本身作为值,最后取字典的values():
# 保留原顺序的去重 unique_data = list({tuple(sorted(d.items())): d for d in data}.values()) print(unique_data)
同样,若键顺序固定,可去掉sorted():
unique_data = list({tuple(d.items()): d for d in data}.values())
复杂度说明
以上方法的时间复杂度均为O(n),是处理字典列表去重的高效方案,适合大多数场景。
内容的提问来源于stack exchange,提问作者user32709636
相关产品推荐
相关产品推荐

