我有此代码:
vals = [(1,3,5),(2,2,5),(1,2,6)]
max(vals ,key=itemgetter(1))[2]
我的问题是:为什么它返回5而不是6?我需要最后一个元素的最大值。如果我采用max(...)[0]
,则给出2;如果我采用max(...)[1]
,则给出3;但是如果我采用max(...)[2]
,则给出5。为什么?
答案 0 :(得分:2)
通过使用itemgetter(1)
键控,您要求Python根据第1个元素的值采用最大元组 。 (1,3,5)在第1个索引(即3)中具有最大的元素。然后,您可以从该元组(即5)访问第二个索引。
要获取最后一个元素的最大值,请改用此值:
>>> max([c for a,b,c in vals])
6
答案 1 :(得分:1)
key=itemgetter(1)
表示max
检查tuple
的 second 元素,确定哪个tuple
是“最大”元组。>
因此,由于3
高于2
,因此它选择第一个元组,然后选择最后一个值,然后得到5
如果您想要6
,我想您可以max(vals ,key=itemgetter(2))[2]
但是您也可以获取索引2的值并执行以下最大值:
max(map(itemgetter(2),vals))
因为您要丢弃其他值
答案 2 :(得分:1)
如果需要最后一个元素,只需在代码中使用索引-1
就可以了。在您的代码中,1
在max
中选择每个元组的第二个元素进行比较,而2
不必要地硬编码了元组的长度为三的知识。
>>> vals = [(1,3,5),(2,2,5),(1,2,6)]
>>> max(vals, key=itemgetter(-1))[-1]
>>> 6
答案 3 :(得分:0)
x[2]
是元组的3个元素,应在其上计算max,而[2]
是元组的第三个元素
max(vals ,key=lambda x:x[2])[2]
或
max(vals ,key=itemgetter(2))[2] # you were using itemgetter(1) which would be second element of the tuple
答案 4 :(得分:0)
如果我通过了 index ,我会这样做:
vals = [(1,3,5),(2,2,5),(1,2,6)]
max(vals[2])
#> 6