Python 具有元组键的最大函数[更新]
我正试图了解以下几行发生了什么:Python 具有元组键的最大函数[更新],python,Python,我正试图了解以下几行发生了什么: print(max([1, -2, 3, -1], key=lambda x:(-abs(x), x), default=0)) 我的理解是,lambda将为列表[1,-2,3,-1]中的每个元素返回一个元组 但是如何将列表与元组进行比较呢 为什么输出是1,而不是3 我试过了 print(max([1, -2, 3, -1], key=(-1, 1), default=0)) 但它说uple是不可调用的 理解这里问题的关键是使用的关键函数。如果很难理解,我
print(max([1, -2, 3, -1], key=lambda x:(-abs(x), x), default=0))
我的理解是,lambda将为列表[1,-2,3,-1]中的每个元素返回一个元组
但是如何将列表与元组进行比较呢
为什么输出是1,而不是3
我试过了
print(max([1, -2, 3, -1], key=(-1, 1), default=0))
但它说uple是不可调用的
理解这里问题的关键是使用的关键函数。如果很难理解,我建议你阅读并使用sort而不是max(因为sort会给你一个信息提示) 我的理解:
第一步。lambda函数将
a=[1,-2,3,-1]
转换为新的b=[(-1,1),(-2,-2),(-3,3),(-1,1)]
第二步。max/sort将处理新列表
b
。它将首先比较第一个元素,如果并列,则比较第二个步骤三根据
a
转换排序的(b)
,max函数遍历列表中的每个元素,并应用lambda函数确定每个项目的值,给出:
[(-1,1), (-2,-2), (-3,3), (-1,-1)]
然后运行max,默认情况下,max首先比较每个元组第一个索引处的项。由于第一个元素在所有情况下都是负数,-1
是最大的第一个元素,它对应于原始数组中的1
和-1
。由于存在一个平局,它将给出(-1,1)
的第二个元素与这个新数组中的最大元素进行比较,它对应于原始数组中的1
。您使用了key=lambda x:(-abs(x),x)这意味着与max相反,这就是为什么它没有得到尽可能大的数字,而是给出了最低的数字。注意,如果存在+-相同的数字,则max将始终获得的数字是正数,因为它的abs()
“为什么输出是1,而不是3?”因为它首先应用abs(x),然后使其为负数,所以-1大于-3。因为abs()的原因,列表中的所有数字都被视为正数它给出的不是尽可能大的数字,而是最低的数字——我想你可以说它给出的数字最接近于零,不管符号是什么。@Jeppe yes。最接近于零,因为零是可能的最低绝对数!我做了一些额外的工作来理解这一点。因此,实际比较的列表是
[(-1,1),(-2,-2),(-3,3),(-1,-1)]
,当比较此列表时,结果将反映回原始列表[1,-2,3,-1]
是。完全正确。
print(max([1, -2, 3, -1], key=lambda x:(-abs(x), x), default=0))
print(max([1, -2, 3, -1], key=lambda x:(abs(x), x), default=0))
print(max([-2, 3, 4, 5], key=lambda x:(-abs(x), x), default=0))
results:
1
3
-2