Python 如何在max(x,key=custom_函数)函数中使用自定义函数?

Python 如何在max(x,key=custom_函数)函数中使用自定义函数?,python,max,built-in,Python,Max,Built In,我有一个自定义数据类型,比如:mytime,它表示小时和分钟,比如29:45,它是29小时45分钟 我想使用max内置函数来查找列表列表中的项,其元素之和最大,其中所有列表都包含mytime类型的值 a、 b、c、d是mytime类型 这里不行,因为a,b,c,d不是整数 如果我在python命令行中输入a+b,我会得到这两个时间值的总和,结果是mytime类型,没有任何错误 这里如何使用max函数?您确定使用a+b有效吗?sum所做的就是重复地将+应用于相邻元素,这与reduceoperato

我有一个自定义数据类型,比如:mytime,它表示小时和分钟,比如29:45,它是29小时45分钟

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

a、 b、c、d是mytime类型

这里不行,因为a,b,c,d不是整数

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

这里如何使用max函数?

您确定使用a+b有效吗?sum所做的就是重复地将+应用于相邻元素,这与reduceoperator.add相同,序列中有一个特殊情况,用于在字符串上断开。。。因此,如果它确实起作用-那么maxx,key=sum应该起作用-只要mydate支持比较运算符-例如__

范例

您需要定义uu gt uuuuuuumax才能工作

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)
你确定使用a+b有效吗?sum所做的就是重复地将+应用于相邻元素,这与reduceoperator.add相同,序列中有一个特殊情况,用于在字符串上断开。。。因此,如果它确实起作用-那么maxx,key=sum应该起作用-只要mydate支持比较运算符-例如__

范例

您需要定义uu gt uuuuuuumax才能工作

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)

您可以编写自己的求和函数:

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。唯一的要求是可以分别为e[0]和e[1]填写mytime的小时数和分钟数


上述代码返回本例中最大的元素[9,0,4,0]。

您可以编写自己的求和函数:

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。唯一的要求是可以分别为e[0]和e[1]填写mytime的小时数和分钟数


上面的代码返回本例中最大的元素[9,0,4,0]。

假设您的类如下所示:

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 
你是这样使用它的:

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:不支持+:“int”和“mytime”的操作数类型

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

0 + mytime(10, 10)    
这将失败

解决方案:

您的问题的解决方案是实现_radd_uu函数,该函数表示反向加法,当参数无法在正向上解析时调用。例如,如果可能的话,x+y被计算为x.uu add_uy,但是如果不存在,那么Python会尝试y.u radd_ux

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

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

在这个实现中,sum函数将对您起作用,忽略其他值,这在您的情况下可能很好。

假设您的类如下所示:

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 
你是这样使用它的:

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:不支持+:“int”和“mytime”的操作数类型

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

0 + mytime(10, 10)    
这将失败

解决方案:

您的问题的解决方案是实现_radd_uu函数,该函数表示反向加法,当参数无法在正向上解析时调用。例如,如果可能的话,x+y被计算为x.uu add_uy,但是如果不存在,那么Python会尝试y.u radd_ux

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

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

在这个实现中,sum函数将在忽略其他值的情况下为您工作,这在您的情况下可能很好。

那么给定x=[[a,b],[c,d]],您想要x的子列表,使得该子列表中的mytime元素的总和以小时和分钟计是最大的?或者你想知道这些子列表中最大的时间和吗?我想得到x的子列表,它的元素和是最大的。例如,如果x=[[02:00,03:00],[09:00,04:00],[09:00,04:00],那么我想要得到[09:00,04:00]。那么给定x=[[a,b],[c,d]],您想要x的子列表,使得该子列表中的mytime元素之和以小时和分钟为单位最大?或者你想知道这些子列表中最大的时间和吗?我想得到x的子列表,它的元素和是最大的。例如,如果x=[[02:00,03:00],[09:00,04:00]],那么我想要得到[09:00,04:00]。是的,a+b有效。但是maxx,key=sum不起作用,因为我得到了:TypeError:不支持的+:“int”和“mytime”操作数类型错误。@alwbtc已扩展了答案-您可能需要修改\uu添加_
_或者添加uu iadd uu u u u u u u u u u u u u u u u u u u u u u u u。但是maxx,key=sum不起作用,因为我得到了:TypeError:不支持的+操作数类型:'int'和'mytime'错误。@alwbtc已扩展了答案-您可能需要修改uu add_uuu或add u iadd_uu以解决使用int's进行+'ing的问题