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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:01:11