如何从包含Python对象的列表中找到最大值?

2024-10-17 21:46:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一门课:

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

我创建了上述类点的对象列表,其中包含字段x和{}。在

我想找到列表中所有对象的xy的最大值。例如,从列表[Point(1,3), Point(5,2), Point(8,0)]中,它将是8。在

我可以这样做:

^{pr2}$

在Python中最优雅的方法是什么?在


Tags: 对象方法self列表objectinitdefclass
3条回答

可以使用vars返回实例属性的字典,然后使用.values方法访问这些值。在

>> class Point(object):
...     def __init__(self, x, y):
...         self.x = x
...         self.y = y
... 
>>> points = [Point(1,3), Point(5,2), Point(8,0)]
>>> max_obj = max(points, key=lambda p: max(vars(p).values()))
>>> max_obj.x
8

如果您只对最大值感兴趣,可以执行以下操作:

^{pr2}$

如果您发现自己经常这样做,那么您可能需要实现类的富比较排序方法和一个实例方法,该方法返回属性的最大值。在

In [7]: import functools

In [8]: @functools.total_ordering
   ...: class Point(object):
   ...:     def __init__(self, x, y):
   ...:         self.x = x
   ...:         self.y = y
   ...:     def max_attr_value(self):
   ...:         return max(vars(self).values())
   ...:     def __eq__(self, other):
   ...:         return self.max_attr_value() == other.max_attr_value()
   ...:     def __lt__(self, other):
   ...:         return self.max_attr_value() < other.max_attr_value()
   ...:     

In [9]: points = [Point(1,3), Point(5,2), Point(8,0)]

In [10]: max(points).max_attr_value()
Out[10]: 8

您可以将max函数与键一起使用:

max_obj = max(your_list, key=lambda p: p.x if p.x > p.y else p.y)

要获得最大值,您可以

^{pr2}$

或者(正如OP建议的那样)。。。在

max_val = max(max_obj.x, max_obj.y)
print(max_val)

虽然您可以像@Coldspeed所说的那样使用max()key,但从长远来看,我认为一个更好的解决方案是为您的Point类重载小于和大于运算符。这样你只需要实现一次逻辑。如果你要改变逻辑的话,你也要改变它:

>>> class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __gt__(self, point):
        return self.x > point.x or self.y > point.y
    def __lt__(self, point):
        return self.x < point.x or self.y < point.y


>>> points = [Point(1,3), Point(5,2), Point(8,0)]
>>> point = max(points)
>>> point.x
8
>>>

如果要获得最大值,可以使用一个简单的三元条件:

^{pr2}$

相关问题 更多 >