Python:统计字典列表重复条目并按元组规则排序输出的问题
问题
我有一个字典列表,需求如下:
- 统计列表中唯一条目的出现次数;
- 根据键"corrected_word"对应的元组中的数值(排序规则为2 < 3 < 33)对结果进行排序;
- 将统计的次数添加到corrected_word的元组末尾,输出指定格式的字典列表。
示例输入
mylist = [ {'original_word': 'test1', 'corrected_word': ('test12', 3)}, {'original_word': 'test1', 'corrected_word': ('test12', 3)}, {'original_word': 'test2', 'corrected_word': ('test22', 2)}, {'original_word': 'test3', 'corrected_word': ('test3', 33)}, {'original_word': 'test3', 'corrected_word': ('test3', 33)}, {'original_word': 'test3', 'corrected_word': ('test3', 33)} ]
预期输出
mylist = [ {'original_word': 'test2', 'corrected_word': ('test22', 2, 1)}, {'original_word': 'test1', 'corrected_word': ('test12', 3, 2)}, {'original_word': 'test3', 'corrected_word': ('test3', 33, 3)} ]
我尝试了以下代码,但无法返回目标格式的字典列表:
from collections import Counter Counter([str(i) for i in mylist])
解决方案
核心思路
直接将字典转字符串统计的方式无法保留原结构,我们需要以original_word和corrected_word作为唯一标识统计次数,再按规则排序并重构字典。
完整实现代码
from collections import Counter mylist = [ {'original_word': 'test1', 'corrected_word': ('test12', 3)}, {'original_word': 'test1', 'corrected_word': ('test12', 3)}, {'original_word': 'test2', 'corrected_word': ('test22', 2)}, {'original_word': 'test3', 'corrected_word': ('test3', 33)}, {'original_word': 'test3', 'corrected_word': ('test3', 33)}, {'original_word': 'test3', 'corrected_word': ('test3', 33)} ] # 1. 统计唯一条目出现次数:用(original_word, corrected_word)作为统计键 counts = Counter((item['original_word'], item['corrected_word']) for item in mylist) # 2. 按corrected_word元组的数值排序 sorted_items = sorted(counts.keys(), key=lambda x: x[1][1]) # 3. 构造最终结果:将次数追加到corrected_word元组末尾 result = [] for orig_word, corr_word in sorted_items: result.append({ 'original_word': orig_word, 'corrected_word': corr_word + (counts[(orig_word, corr_word)],) }) # 输出验证 for item in result: print(item)
代码解释
- 统计次数:使用
Counter,把每个条目的original_word和corrected_word组合成可哈希的元组作为统计键,确保重复条目被正确计数。 - 排序:通过
sorted函数的key参数,指定按corrected_word元组的第二个元素(即目标排序数值)排序,刚好符合2 < 3 < 33的规则。 - 重构结果:遍历排序后的唯一条目,将统计次数追加到
corrected_word元组末尾,重新构造成目标格式的字典。
运行结果
执行代码后会输出与预期一致的字典列表:
{'original_word': 'test2', 'corrected_word': ('test22', 2, 1)} {'original_word': 'test1', 'corrected_word': ('test12', 3, 2)} {'original_word': 'test3', 'corrected_word': ('test3', 33, 3)}
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

