获取元组列表中元素元组的最大值

3

我有这段代码:

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。为什么会这样呢?

4个回答

2
通过使用itemgetter(1),你要求Python基于第1个元素的值来获取最大元组。 (1,3,5)在第1个索引处有最大的元素(即3)。 然后你从那个元组中访问第2个索引(即5)。
如果要获取最后一个元素的最大值,请使用以下代码:
>>> max([c for a,b,c in vals])
6

你为什么要传递一个列表而不是生成器给max函数呢? - MooingRawr
不是很确定,两种方法都可以。除非数据量非常大,否则列表推导式可能会更快。 - wim
我不确定这里的惯例,但是使用for _, _, c in vals来避免命名未使用的变量是否合适? - jpp
我不喜欢使用“_”约定,它可能会干扰Web应用程序中的gettext,并且绑定此名称可能无意中禁用先前值的repl钩子。在不影响可读性的情况下,我不介意为一次性变量命名。 - wim

1
"

key=itemgetter(1) 的意思是 max 检查 tuple 的第二个元素来确定哪个 tuple 是“最大的”tuple

因此,它选择第一个 tuple,因为 32 更高,然后您选择最后一个值,您将获得 5

如果您想要 6,我想您可以这样做:max(vals,key = itemgetter(2))[2]

但是您也可以获取索引2的值并执行max操作,如下所示:

"
max(map(itemgetter(2),vals))

由于您正在丢弃其他值


1
如果您想获取最后一个元素,只需在代码中使用索引-1来表示。在您的代码中,1选择每个元组的第二个元素进行max比较,2是不必要地硬编码了您的元组长度为三的知识。
>>> vals = [(1,3,5),(2,2,5),(1,2,6)]
>>> max(vals, key=itemgetter(-1))[-1]
>>> 6

0

x[2] 是元组中用于计算最大值的第3个元素,[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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接