1

我有一个自定义数据类型,比如说: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在这里使用函数?

4

3 回答 3

4

假设您的课程如下所示:

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)

但它会失败:

类型错误:+ 不支持的操作数类型:“int”和“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值,这在您的情况下可能很好)。

于 2012-07-17T11:56:35.593 回答
1

你确定使用a + b作品吗?所做的一切sum都是重复应用于相邻元素(这与打破字符串的特殊情况+相同)......所以如果它确实有效 - 那么应该只是工作 -只要支持比较运算符 -例如,,reduce(operator.add, sequence)max(x, key=sum)mydate__gt____eq____lt__

例子

您需要__gt__定义 max 才能工作...

class mydate(object):
    def __init__(self, num):
        self.num = num
    def __add__(self, other): # make sure sum works
        return self.num + other.num
    def __gt__(self, other): # make sure max can do > comparison
        return self.num > other.num
    def __repr__(self):
        return 'date: {}'.format(self.num)


x = mydate(3)
y = mydate(5)
z = mydate(2)

print max([x,y,z], key=sum)
于 2012-07-17T10:02:25.817 回答
1

您可以编写自己的 sum 函数:

def my_sum(item):
    return sum(60 * e[0] + e[1] for e in item)

x = [[(2,0), (3,0)], [(9, 0), (4, 0)]]
print max(x, key=my_sum)

我已将您的mytime数据结构表示为元组(带有小时和分钟),因此您可能需要调整my_sum您的数据结构。唯一的要求是a的小时和分钟mytime可以分别填入fore[0]e[1]

上面的代码返回最大的元素(在这种情况下[(9, 0), (4, 0)])。

于 2012-07-17T10:12:27.913 回答