Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有元组键的最大函数[更新]_Python - Fatal编程技术网

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