Python字典n[i,j]按i分组求每组最大值的实现方法
解决方法:按固定i值查找字典中的最大值
没问题,这有几种实用的Python方法帮你完成这个需求——针对每个固定的i,找到字典n中对应条目的最大值及对应的键:
首先,先把你的字典用标准Python语法构造出来,方便后续操作:
n = { (1, 1): 3, (1, 2): 4, (1, 3): 7, (2, 1): 5, (2, 2): 64, (2, 3): 32, (3, 1): 21, (3, 2): 21, (3, 3): 45 }
方法1:手动分组查找(直观易懂)
先按i值把所有条目分组,再对每组求最大值:
# 初始化分组字典,键是i值,值是(数值, 原键)的列表 groups = {} for key, value in n.items(): i, j = key if i not in groups: groups[i] = [] groups[i].append( (value, key) ) # 遍历每个分组,找到最大值并输出 for i in groups: max_value, max_key = max(groups[i]) print(f"当i={i}时,最大值为`n{max_key} = {max_value}`")
运行这段代码会输出:
当i=1时,最大值为`n(1, 3) = 7` 当i=2时,最大值为`n(2, 2) = 64` 当i=3时,最大值为`n(3, 3) = 45`
方法2:用itertools.groupby(简洁的分组工具)
如果喜欢用标准库工具,可以用itertools.groupby,注意需要先按i值排序(因为groupby只对连续的相同键分组):
from itertools import groupby # 先按i值排序,确保同一i的条目连续排列 sorted_items = sorted(n.items(), key=lambda x: x[0][0]) # 按i值分组并查找最大值 for i, group in groupby(sorted_items, key=lambda x: x[0][0]): # 从组中提取(数值, 原键)对,直接取最大值 max_val, max_key = max( (v, k) for k, v in group ) print(f"当i={i}时,最大值为`n{max_key} = {max_val}`")
方法3:字典推导式(一行式风格)
如果想要更紧凑的代码,可以用字典推导式直接生成每个i对应的最大值结果:
# 生成{ i: (最大值, 对应键) }的字典 max_per_i = { i: max( (v, k) for k, v in n.items() if k[0] == i ) for i in { key[0] for key in n.keys() } # 提取所有唯一的i值 } # 遍历输出结果 for i, (val, key) in max_per_i.items(): print(f"当i={i}时,最大值为`n{key} = {val}`")
额外说明
如果存在多个j对应同一个最大值(比如你的例子中i=3时,(3,1)和(3,2)的值都是21),上面的方法会返回第一个遇到的键。如果需要收集所有达到最大值的键,可以稍微调整代码,比如:
for i in groups: # 先找到当前组的最大值 max_val = max(v for v, k in groups[i]) # 收集所有等于最大值的键 max_keys = [k for v, k in groups[i] if v == max_val] print(f"当i={i}时,最大值为{max_val},对应的键有:{max_keys}")
这段代码会输出:
当i=1时,最大值为7,对应的键有:[(1, 3)] 当i=2时,最大值为64,对应的键有:[(2, 2)] 当i=3时,最大值为45,对应的键有:[(3, 3)]
内容的提问来源于stack exchange,提问作者Angriffskeule
相关产品推荐
相关产品推荐

