Python中如何基于4个键中的2个获取字典的唯一列表
更符合Pythonic规范的去重实现
你的现有逻辑可以正常跑通,优化方向主要是减少手动维护两个列表的冗余代码、提升去重环节的查找效率,可以借助Python字典键唯一的特性实现更简洁的写法:
基础实现(适配Python3.7+)
Python3.7及以上版本中,字典会自动保留元素的插入顺序,可完全替代手动维护去重标识列表的逻辑:
unique_releases = list({ item["release_id"]: { "release_id": item["release_id"], "release_name": item["release_name"], "release_date": item["release_date"] } for item in release_list }.values())
实现说明:
- 以每条记录的
release_id作为字典键,重复的同ID记录会自动覆盖,完成自动去重 - 最终取字典的
values生成列表,保留的顺序和原列表中同ID记录第一次出现的顺序完全一致,输出结构和你预期的效果没有差异 - 相比原有实现,字典键的存在性判断是O(1)时间复杂度的哈希查找,比原来用列表判断
release_id是否存在的O(n)线性查找效率更高,不会随列表长度增加出现明显性能损耗
顺带一提,你现有代码里的字典取值存在字符串引号不闭合的笔误(比如
i['release_id]没有闭合引号),实际运行时会触发语法错误,写代码时注意补全即可。
灵活适配字段变动
如果后续需要保留的字段变多,手动逐个罗列保留字段会比较繁琐,可以在生成记录时直接剔除不需要的issue_id字段,无需每次调整代码:
unique_releases = list({ item["release_id"]: {k: v for k, v in item.items() if k != "issue_id"} for item in release_list }.values())
这种写法会自动保留同release_id下除issue_id外的所有字段,适配后续字段增减的场景。
低版本Python兼容方案
如果使用的是3.7以下的Python版本,无法依赖普通字典的插入顺序,可以使用collections.OrderedDict实现完全一致的效果:
from collections import OrderedDict unique_releases = list(OrderedDict({ item["release_id"]: {k: v for k, v in item.items() if k != "issue_id"} for item in release_list }.values()))
内容的提问来源于stack exchange,提问作者Looz
相关产品推荐
相关产品推荐

