Python如何移除字典列表中name和flag字段相同的半重复元素?
问题实现方案
结论
可以通过列表推导式实现需求,仅需额外借助一个可哈希的集合记录已经出现过的name与flag组合即可。
代码实现(Python 3.8+ 支持海象运算符版本,可读性更高)
# 原始数据 raw_data = [ {'name':'A', 'flag':'2','id':'x1'}, {'name':'A', 'flag':'2','id':'x2'}, {'name':'A','flag':'1','id':'x3'}, {'name':'B', 'flag':'2','id':'x4'} ] seen_keys = set() result = [ item for item in raw_data if (current_key := (item['name'], item['flag'])) not in seen_keys and not seen_keys.add(current_key) ]
代码实现(兼容低版本Python)
如果使用的Python版本低于3.8,不支持海象运算符,可使用以下写法:
seen_keys = set() result = [ item for item in raw_data if (item['name'], item['flag']) not in seen_keys and not seen_keys.add((item['name'], item['flag'])) ]
实现逻辑说明
- 我们将每条字典的
name和flag字段拼接为元组作为去重判断的键,元组是可哈希类型,可以存入集合 - 利用
and的短路执行特性:只有当前键不在已出现集合中时,才会执行set.add()操作将键存入集合 set.add()方法返回值为None,not None的结果为True,因此首次出现的元素会被保留到结果列表中,后续重复出现的同键元素会被直接过滤
输出结果验证
执行后result的内容符合需求:
[{'name':'A', 'flag':'2','id':'x1'}, {'name':'A', 'flag':'1','id':'x3'}, {'name':'B', 'flag':'2','id':'x4'}]
内容的提问来源于stack exchange,提问作者Hugo_Ludo_38
相关产品推荐
相关产品推荐

