我有一个自定义数据类型,例如: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 值,这可能适合您的情况)。
