如何按值排序词频字典并保留原键的首次出现顺序?
优化词频统计与排序方案
原方案的性能问题
原代码中words.count(i)会对每个单词遍历整个列表,时间复杂度达到O(n²),文本量较大时性能会急剧下降;后续的嵌套循环和字母序排序还会破坏「同频词保留首次出现顺序」的要求。
优化实现思路
- 一次遍历完成双统计:遍历单词列表时,同时记录每个词的出现次数和首次出现的索引,时间复杂度仅为O(n)。
- 自定义排序规则:排序优先按词频降序,词频相同时按首次出现索引升序,确保同频词顺序与原文本首次出现顺序一致。
- 利用字典插入顺序特性:Python 3.7+的原生字典会保留插入顺序,排序后直接构造字典即可得到符合要求的输出。
代码实现
from collections import defaultdict # 处理输入:转小写并拆分单词 words = input().lower().split() # 统计词频和首次出现索引 freq = defaultdict(int) first_occur = {} for idx, word in enumerate(words): freq[word] += 1 # 仅记录单词第一次出现的位置 if word not in first_occur: first_occur[word] = idx # 按规则排序:词频降序优先,同频则按首次出现顺序升序 sorted_items = sorted(freq.items(), key=lambda x: (-x[1], first_occur[x[0]])) # 转换为结果字典(Python3.7+自动保留插入顺序) result = dict(sorted_items) print(result)
测试示例
输入:
Hi I live in America I love cooking
输出:
{'i': 2, 'hi': 1, 'live': 1, 'in': 1, 'america': 1, 'love': 1, 'cooking': 1}
内容的提问来源于stack exchange,提问作者Rishabh Kumar
相关产品推荐
相关产品推荐

