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

更Pythonic的实现:将值可重复的字典转为字典列表

Pythonic Way to Convert a Dict with Unique Keys & Duplicate Values to a List of Dicts

嘿,这个需求我懂了——你想把一个键唯一但值可能重复的字典,转换成每个元素都是单键字典的列表,每个单键字典的键是原字典的值,值是原字典中对应所有键的列表。下面给你两个非常Pythonic的实现方案:

方案1:使用collections.defaultdict(推荐,可读性拉满)

defaultdict是Python标准库中专门用来处理这种需要自动初始化容器类型的场景,用它来收集相同值对应的键非常方便:

from collections import defaultdict

original_dict = {'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa': 401, 'a': 2}

# 先构建值到键列表的反向映射
reverse_mapping = defaultdict(list)
for key, value in original_dict.items():
    reverse_mapping[value].append(key)

# 再通过列表推导式转换成目标格式
result = [{val: keys} for val, keys in reverse_mapping.items()]

print(result)
# 输出:[{68: ['b', 'c', 'x']}, {401: ['z', 'aa']}, {2: ['a']}]

方案2:使用dict.setdefault(无需额外导入模块)

如果不想导入collections模块,用字典自带的setdefault方法也能实现同样的效果,它会自动为不存在的键初始化指定的默认值(这里是空列表):

original_dict = {'b': 68, 'c': 68, 'x': 68, 'z': 401, 'aa': 401, 'a': 2}

reverse_mapping = {}
for key, value in original_dict.items():
    # 若value不在reverse_mapping中,就创建一个空列表作为它的值
    reverse_mapping.setdefault(value, []).append(key)

# 同样用列表推导式生成结果
result = [{val: keys} for val, keys in reverse_mapping.items()]

print(result)
# 输出和上面完全一致

为什么这两种方式更Pythonic?

  • 避免了手动判断键是否存在的冗余代码(比如if value not in reverse_mapping: reverse_mapping[value] = []这种写法),代码更简洁。
  • 利用了Python的内置工具和推导式,可读性和效率都很高。
  • 完全满足你的需求:最终输出是字典列表,而不是单个反向字典或元组结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:26:45