Python如何将字符频次元组列表转为按频次分组的字典
实现方案
本次需求是统计字符串内各字符的出现频次,最终生成以频次为键、对应该频次的所有字符组成的列表为值的字典。
你目前的代码已经完成了字符和对应频次的去重提取,只需要补充按频次分组的逻辑即可,以下是可直接运行的实现:
方法1:基础字典实现(无需额外导包)
逻辑最直观,适合入门理解:
s = 'aaabccdd' # 第一步:统计每个字符的出现频次 char_count = {} for c in s: # 字符已存在就计数+1,不存在就初始化为1 char_count[c] = char_count.get(c, 0) + 1 # 第二步:按频次分组 res = {} for char, cnt in char_count.items(): # 频次不存在就先初始化空列表,再追加字符 res.setdefault(cnt, []).append(char) # 若需要按键(频次)升序排列,加上下方排序逻辑 res = dict(sorted(res.items())) print(res)
运行输出:
{1: ['b'], 2: ['c', 'd'], 3: ['a']}
如果要基于你原有代码已经生成的h列表(元素为(字符, 频次)格式的元组)做分组,可以直接跳过第一步统计逻辑,遍历h完成分组即可:
h = [('a', 3), ('d', 2), ('b', 1), ('c', 2)] res = {} for char, cnt in h: res.setdefault(cnt, []).append(char) res = dict(sorted(res.items())) print(res)
方法2:用标准库简化实现
Python标准库collections提供了专门的计数工具,代码更简洁、运行效率更高:
from collections import Counter, defaultdict s = 'aaabccdd' # 一步完成字符频次统计 char_count = Counter(s) # 初始化默认值为列表的字典,省去键存在判断 res = defaultdict(list) for char, cnt in char_count.items(): res[cnt].append(char) res = dict(sorted(res.items())) print(res)
注:原有代码中在循环内反复调用
list.count()的写法时间复杂度较高,字符串长度较大时运行速度会明显变慢,不推荐使用。
内容的提问来源于stack exchange,提问作者Ankit Patne
相关产品推荐
相关产品推荐

