You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:10:19