Pythonic实现:统计字典列表各索引最大值归属键的次数
更Pythonic的字典列表索引最大值统计实现
需求回顾
给定值为等长列表的字典,统计每个键在对应索引位置上取到最大值的次数。例如:
输入:
my_dict = {'a': [1, 2, 5], 'b': [2, 1, 4], 'c': [1, 0, 3]}
期望输出:
count_dict = {'a': 2, 'b': 1, 'c': 0}
原因是索引0处b的值最大,索引1、2处a的值最大。
替代嵌套循环的实现方案
方案1:利用zip转置 + Counter统计
from collections import Counter my_dict = {'a': [1, 2, 5], 'b': [2, 1, 4], 'c': [1, 0, 3]} # 转置所有值列表,生成每个索引位置的(值, 键)元组集合 index_groups = zip(*((val, key) for key, val in my_dict.items())) # 对每个索引组取最大值对应的键,用Counter统计出现次数 winner_counts = Counter(max(group, key=lambda x: x[0])[1] for group in index_groups) # 补全所有键的计数,未获最大值的键设为0 count_dict = {key: winner_counts.get(key, 0) for key in my_dict} print(count_dict) # 输出: {'a': 2, 'b': 1, 'c': 0}
说明:
zip(*...)将各个键对应的列表按索引对齐,把同一索引的所有值和键打包成组max(group, key=lambda x: x[0])直接取出该索引组中值最大的(值,键)元组,提取键作为当前索引的获胜者Counter自动统计每个获胜键的出现次数,最后用字典推导式补全所有键的计数,确保无获胜记录的键显示0
方案2:无额外依赖的简洁实现
如果不想引入Counter,可以直接初始化计数字典后遍历处理:
my_dict = {'a': [1, 2, 5], 'b': [2, 1, 4], 'c': [1, 0, 3]} count_dict = {key: 0 for key in my_dict} # 转置值列表并关联对应键,遍历每个索引的所有值和键 for *values, keys in zip(*my_dict.values(), my_dict.keys()): max_val = max(values) # 找到最大值对应的键,计数+1 winner_key = keys[values.index(max_val)] count_dict[winner_key] += 1 print(count_dict) # 输出: {'a': 2, 'b': 1, 'c': 0}
说明:
zip(*my_dict.values())转置得到每个索引的所有值,再与键列表my_dict.keys()打包,每个迭代项包含当前索引的所有值和对应的键- 通过
values.index(max_val)找到最大值在值列表中的位置,对应到键列表中的获胜键
这两种方案都避免了手动遍历索引的嵌套循环,充分利用Python内置的迭代器和函数,代码更简洁易读,符合Pythonic风格。
内容的提问来源于stack exchange,提问作者Tonino Fernandez
相关产品推荐
相关产品推荐

