如何基于动态字典列表计算NRR?求技术实现思路
计算动态字典列表的净跑垒率(NRR)
别担心,咱们一步步拆解这个问题,不管是继续用enumerate还是换其他更直接的方法,都能轻松搞定!
首先先明确你的数据结构——我假设你的动态列表大概是这样的(如果结构有差异,核心逻辑依然通用):
match_data = [ {"runs": 165, "balls": 120}, {"runs": 192, "balls": 115}, # 后续会动态添加更多比赛字典 ]
方法一:继续用enumerate(适合需要跟踪比赛索引的场景)
你之前用enumerate拿到了索引和字典,接下来只需要从每个字典里提取runs和balls的值,套用公式计算就行。这里要注意避免除以0的错误,以及处理字典键可能缺失的情况:
for index, match in enumerate(match_data): # 用get方法避免KeyError,同时设置默认值 runs = match.get("runs", 0) balls = match.get("balls", 0) if balls == 0: # 根据业务逻辑处理,比如设为0或者抛出提示 nrr = 0.0 else: nrr = (runs / balls) * 100 print(f"第{index + 1}场比赛的NRR: {nrr:.2f}")
enumerate在这里的作用只是帮你标记是第几个元素,如果你不需要跟踪索引,完全可以不用它——看下面的更简洁方法。
方法二:直接遍历列表(无需索引时首选)
如果不需要知道是第几场比赛,直接遍历列表里的每个字典就行,还可以顺便计算总NRR:
total_runs = 0 total_balls = 0 for match in match_data: runs = match.get("runs", 0) balls = match.get("balls", 0) # 计算单场NRR single_nrr = (runs / balls) * 100 if balls != 0 else 0.0 print(f"单场NRR: {single_nrr:.2f}") # 累加总数据用于计算总NRR total_runs += runs total_balls += balls # 计算总NRR if total_balls != 0: overall_nrr = (total_runs / total_balls) * 100 else: overall_nrr = 0.0 print(f"\n所有比赛的总NRR: {overall_nrr:.2f}")
额外注意事项
- 边界处理:一定要判断
balls是否为0,否则会触发ZeroDivisionError,这是实际场景里很容易踩的坑。 - 键安全访问:用
dict.get(key, default)代替直接dict[key],可以避免因为某个字典缺失runs或balls键导致的报错。 - 动态列表适配:不管你的列表是静态还是动态添加元素,只要保持字典的键一致,上面的代码都能直接复用——新增的字典会在遍历的时候自动被计算。
内容的提问来源于stack exchange,提问作者nihkil
相关产品推荐
相关产品推荐

