如何找出字典列表中每个键对应的最常见值?
问题分析
你的代码存在两个核心问题:
- 循环逻辑错误:
for age in age_of_users for category in age_with_category会遍历每个年龄和所有字典,导致错误获取不属于该年龄的类别(甚至触发KeyError,比如用年龄18去访问{43:'electronic'}这个字典)。 - 未按年龄分组统计:你把所有年龄的类别混在一起用
Counter统计,只能得到全局出现次数最多的类别,而非每个年龄各自的最常见类别。
正确解决方案
我们需要先按年龄分组收集对应类别,再对每个年龄的类别列表单独统计频率:
from collections import Counter age_with_category = [{18: 'book'}, {18: 'electronic'}, {43: 'electronic'}, {18: 'book'}, {18: 'book'}, {43:'electronic'}] # 按年龄分组,收集每个年龄对应的所有类别 age_grouped = {} for entry in age_with_category: # 取出单键字典中的年龄和类别 age = next(iter(entry)) category = entry[age] # 自动初始化列表并追加类别 age_grouped.setdefault(age, []).append(category) # 统计每个年龄的最常见类别,整理为目标格式 result = [] for age, categories in age_grouped.items(): # most_common(1)返回[(类别, 次数)],取第一个元素的类别值 top_category = Counter(categories).most_common(1)[0][0] result.append({age: top_category}) print(result) # 输出: [{18: 'book'}, {43: 'electronic'}]
关键说明
- 用
next(iter(entry))提取单键字典的年龄,无需手动维护age_of_users列表,避免数据不一致。 dict.setdefault()简化分组逻辑,省去判断键是否存在的冗余代码。- 对每个年龄的类别列表单独使用
Counter,确保统计的是该年龄下的类别频率。
内容的提问来源于stack exchange,提问作者FrozenChicken
相关产品推荐
相关产品推荐

