You need to enable JavaScript to run this app. Python中如何用字典推导式实现键值反转并聚合同值键?
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何用字典推导式实现键值反转并聚合同值键?

字典推导式实现字典反转(值作为新键,同值的原键聚合成列表)

核心问题根源

你之前尝试用推导式做键值追加时出问题,本质是Python语法层面的限制:
字典推导式是单遍遍历、独立计算每个键值对的生成逻辑,整个迭代过程中没有对已生成字典的读写上下文——也就是说,你在遍历计算当前键值对的时候,根本读不到已经写进字典里的其他键值对的状态,自然没法实现“检测到新字典里已经有这个value对应的键,就把原key追加到已有列表里”的逻辑。
你当前写的推导式里的三元判断([key] if value else [key])是完全冗余的:不管value是什么,返回的都是仅包含当前遍历到的原key的单元素列表,碰到重复value时,这个新生成的单元素列表会直接覆盖字典里之前存的对应内容。运行你现有代码,最终输出是{3: ['c']},根本达不到聚合所有同值原key的效果。

可实现需求的推导式写法

既然单次遍历的推导式无法完成累积逻辑,就需要先把同值的原key聚合完成,再组装成字典,两种常用实现方式如下:

1. 纯推导式实现(无外部依赖)

先提取原字典所有不重复的值作为新字典的键,再对每个值用列表推导式收集所有匹配的原key,整个字典的组装完全靠推导式完成:

def invertDictionary(d: dict):
    # 提取原字典中所有将作为新字典键的值
    unique_values = set(d.values())
    # 字典推导式:每个新键对应所有值匹配的原key列表
    return {
        val: [orig_key for orig_key, orig_val in d.items() if orig_val == val]
        for val in unique_values
    }

运行测试用例invertDictionary({'a':3, 'b':3, 'c':3}),输出即为{3: ['a', 'b', 'c']},完全符合预期。

2. 大数据量优化写法

如果原字典规模较大,双层遍历的效率偏低,可以借助collections.defaultdict做单遍遍历的累积,最后用推导式转成标准字典:

from collections import defaultdict

def invertDictionary(d: dict):
    grouped = defaultdict(list)
    # 单遍遍历完成同值原key的累积,效率和你写的普通for循环完全一致
    for orig_key, orig_val in d.items():
        grouped[orig_val].append(orig_key)
    # 用推导式完成类型转换,输出普通字典
    return {new_key: new_val for new_key, new_val in grouped.items()}

附两个代码细节修正

  • 不要用内置类型名dict作为函数参数名,会遮蔽全局内置的字典类型,容易引发后续的类型异常
  • Python语法中行尾的分号无实际作用,不需要在return语句后额外添加

内容的提问来源于stack exchange,提问作者user5443850

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 00:15:04