Skip to main content
 首页 » 编程设计

python之如何在 max(x, key=custom_function) 函数中使用自定义函数

2025年05月04日20落叶无声

我有一个自定义数据类型,例如:mytime ,分别代表小时和分钟,比如29:45,就是29小时45分钟。

我想使用 max内置函数,用于查找列表列表中元素总和最大的项目,其中所有列表包含值 mytime类型。

x = [[a, b], [c, d]] 

a,b,c,d 属于 mytime类型。

max(x, key=sum)  

在这里不起作用,因为 a、b、c、d 不是整数。

如果我输入 a + b在 python 命令行,我得到这两个时间值的总和,结果是 mytime键入,没有任何错误。

我如何使用 max在这里发挥作用?

请您参考如下方法:

假设您的类(class)如下所示:

class mytime(object): 
 
    def __init__(self, h, m): 
        self.h = h 
        self.m = m 
 
    def __add__(self, other): 
        return mytime(self.h + other.h, self.m + other.m) 
 
    def __repr__(self): 
        return '%i:%i' % (self.h, self.m) 

然后你像这样使用它:

a = mytime(10, 10)         
b = mytime(2, 22) 
print a + b  

它将按预期工作:

12:32


问题:

你要做的是:

l = [a, b] 
print sum(l) 

但它会失败:

TypeError: unsupported operand type(s) for +: 'int' and 'mytime'

问题在于 sum 函数将从 0 开始并将列表中的所有值相加。它将尝试评估

0 + mytime(10, 10)     

这会失败。


解决方案:

您的问题的解决方案是实现 __radd__ 函数,它表示“反向添加”,当参数无法在“正向”方向上解析时调用。例如,如果可能,x + y 被评估为 x.__add__(y),但如果不存在,则 Python 会尝试 y.__radd__(x )。

因此您可以将以下方法添加到您的类中:

def __radd__(self, other): 
    return mytime(self.h, self.m) 

sum 函数将为您工作(在此实现中忽略 other 值,这可能适合您的情况)。