max()与关键参数python



我知道一点关于key参数在pythonmax()中是如何使用的。max(("pyth", "lua", "ruby"), key=len)将返回pythruby。然而,max((31, 13, 11), key=lambda x: sum(int(i) for i in str(x)))只会给我31(13也应该返回),或者max((13, 31, 11), key=lambda x: sum(int(i) for i in str(x)))只会给我13(31也应该返回)。有人能解释一下吗?多谢。

关于你的争论:

max(("pyth", "lua", "ruby"), key=len)将返回pythruby

不,它真的不会:

>>> max(("pyth", "lua", "ruby"), key=len)
'pyth'

max函数只返回一个值,即最大值。对于default方法,这通常无关紧要,因为31的两个值可以明智地返回其中一个。

但是,如果您将明显不同的项合并,使它们具有相同的"值",则可以在打印时分辨出差异。

顺便说一下,根据文档,您总是得到迭代过程中找到的第一个(我在最后一段中强调,这一段只明确了一个项,并且在重复的情况下,返回):

max(iterable, *, key=None)
max(iterable, *, default, key=None)
max(arg1, arg2, *args, key=None)

返回可迭代对象中最大的项,或两个或多个参数中最大的项。

如果提供了一个位置参数,它应该是一个可迭代对象。返回可迭代对象中最大的项。如果提供了两个或多个位置参数,则返回最大的位置参数。

有两个可选的关键字参数。key参数指定了与list.sort()类似的单参数排序函数。default参数指定当提供的可迭代对象为空时返回的对象。如果可迭代对象为空且未提供default,则引发ValueError

如果有多个最大值项,函数返回遇到的第一个。这与其他保持排序稳定性的工具,如sorted(iterable, key=keyfunc, reverse=True)[0]heapq.nlargest(1, iterable, key=keyfunc)是一致的。

由于max()只能返回一个值,因此您需要一个自定义函数来返回所有的列表

等于最大数字和的值。你可以这样做:

from functools import cache
v = (31, 13, 11)
@cache
def sum_digits(n): # much faster than converting to strings and slicing
s = 0
while n > 0:
s += n % 10
n //= 10
return s
def getvals(v):
m = sorted(v, key=sum_digits, reverse=True)
result = [m[0]] # effectively the max value
for e in m[1:]:
if sum_digits(e) != sum_digits(m[0]):
break
result.append(e) # has same sum of digits as the max value
return result
print(getvals(v))

输出:

[31, 13]

(max)返回最大的项。如果你想根据数字的和找到最大值,你可以试试这个。

max_value = max(iterable, key=lambda x: sum(int(i) for i in str(x)))

最新更新