我知道一点关于key
参数在pythonmax()
中是如何使用的。max(("pyth", "lua", "ruby"), key=len)
将返回pyth
和ruby
。然而,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)
将返回pyth
和ruby
。
不,它真的不会:
>>> 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)))