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

