Python中如何基于指定条件更优雅地实现两个字典的去重?
字典同name分组取最大值的简洁实现方案
现有两个测试字典:
m = {'a':1, 'b': 2, 'c': 3} n = {'a': ('jack', 'true'), 'b': ('tom', 'true'), 'c': ('jack', 'false')}
需要实现的处理逻辑:
- 仅处理两个字典共有的键,按
n中value存储的第一个字段(name)对m的键值对分组 - 同name分组下,只保留
m中对应值最大的键值对,其余同组键值对移除 - 最终返回保留的键值对组成的新字典,原代码运行得到的正确结果为
{'c': 3, 'b': 2}
原实现通过两层分支判断更新同name的最大值,逻辑正确但嵌套偏多,代码不够紧凑。以下是兼顾可读性和简洁度的优化方案:
无依赖优化版本(无需导入额外库)
# 取两个字典键的交集,直接跳过n中不存在于m的键 common_keys = n.keys() & m.keys() name_max_map = {} for k in common_keys: name = n[k][0] current_val = m[k] # 合并name存在/不存在的分支,直接比较更新 if name not in name_max_map or current_val > name_max_map[name][1]: name_max_map[name] = (k, current_val) new_dict = dict(name_max_map.values())
优化点说明
- 用字典键的集合交集操作
&直接筛出两个字典共有的键,省去循环中单独判断key in m的步骤 - 合并了name已存在/不存在的分支逻辑,减少代码嵌套层级
- 逻辑和原代码完全一致,运行结果和原输出无差异
注:原逻辑中n的value第二个布尔标记字段未参与计算,如果后续需要追加「仅保留标记为true的项」这类规则,在循环内加一行判断即可。
如果追求更短的写法也可以用字典推导式配合max函数实现,但日常开发更推荐上面的写法,方便后续维护。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

