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

Python字典键值交换:如何将频率作为键关联对应字符

解决字典键值交换(多键同值场景)的最优实现

你遇到的问题核心在于字典的键是唯一的——当你直接用{y: x for x, y in letter_frequency.items()}推导时,同一个频率(y值)对应的多个字符(x)会被最后遍历到的那个覆盖,这就是为什么你得到的结果里每个频率只对应一个字符。

要实现「将频率作为键,对应所有出现该频率的字符」,最优的方式是把相同频率的字符收集到一个列表(或集合)中,下面是两种常用的可靠实现:

方法1:使用collections.defaultdict(最简洁)

defaultdict可以自动为不存在的键创建默认容器(比如列表),非常适合这种场景:

from collections import defaultdict

letter_frequency = {'h': 2, 'e': 1, 'l': 4, 'o': 4, ',': 1, ' ': 3, 'w': 2, 'r': 1, 'd': 1, '!': 1, 'n': 1, 'g': 1, '.': 3, '\n': 1}
frequency_to_chars = defaultdict(list)

for char, freq in letter_frequency.items():
    frequency_to_chars[freq].append(char)

# 如果需要转成普通字典(可选)
frequency_to_chars = dict(frequency_to_chars)
print(frequency_to_chars)

输出结果会是:

{2: ['h', 'w'], 1: ['e', ',', 'r', 'd', '!', 'n', 'g', '\n'], 4: ['l', 'o'], 3: [' ', '.']}

方法2:普通字典手动处理(无需导入模块)

如果不想用collections模块,可以手动判断键是否存在:

letter_frequency = {'h': 2, 'e': 1, 'l': 4, 'o': 4, ',': 1, ' ': 3, 'w': 2, 'r': 1, 'd': 1, '!': 1, 'n': 1, 'g': 1, '.': 3, '\n': 1}
frequency_to_chars = {}

for char, freq in letter_frequency.items():
    if freq not in frequency_to_chars:
        frequency_to_chars[freq] = []
    frequency_to_chars[freq].append(char)

print(frequency_to_chars)

这个方法和上面的defaultdict逻辑完全一致,只是手动实现了默认容器的创建,输出结果也相同。

为什么原推导式不行?

再回头看你用的字典推导式:{y: x for x, y in letter_frequency.items()},它的逻辑是每次遇到一个(y, x)对,就把y作为键,x作为值存入字典。如果之前已经有y这个键,新的x会直接覆盖旧值——比如遍历到'h':2时,字典里是{2: 'h'},但后面遍历到'w':2时,就会把2对应的value改成'w',最终每个频率只留下最后一个被遍历到的字符。

所以这种场景下,必须用「键对应容器(列表/集合)」的方式来存储多值,而不是直接存单个值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:43:49