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
相关产品推荐
相关产品推荐

