You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:52:48