Ответ 1
max()
принимает key
параметр, функцию, которая при передаче одного из объектов возвращает значение, с помощью которого их можно сравнивать.
Используйте operator.attrgetter()
чтобы получить это значение:
from operator import attrgetter
max(self.allPartners, key=attrgetter('attrOne'))
Это возвращает объект соответствия, для которого этот атрибут является максимальным. Если вы хотите сохранить только это максимальное значение, у вас есть два варианта:
-
Возьмите атрибут из возвращаемого объекта:
max(self.allPartners, key=attrgetter('attrOne')).attrOne
-
Передавайте только атрибуты вместо
max()
с выражением генератора:max(p.attrOne for p in self.allPartners)
Если вы обнаружите, что вам нужно снова и снова заказывать One
класс в разных направлениях по одному и тому же атрибуту (чтобы найти минимальный, максимальный, сортировать и т.д.), Вы также можете сделать свой класс упорядоченным.
Для этого вам нужно будет реализовать некоторые из основных перехватов настройки, которые будет искать Python. С некоторыми дополнительными обманами вы можете уйти с помощью только операций нижнего и нижнего уровня и с помощью декоратора класса funtools.total_ordering
:
from functools import total_ordering
@total_ordering
class One:
# ...
def __lt__(self, other):
if not isinstance(other, type(self)): return NotImplemented
return self.attrOne < other.attrOne
def __eq__(self, other):
if not isinstance(other, type(self)): return NotImplemented
return self.attrOne == other.attrOne
Теперь ваш One
класс упорядочен, полностью на основе attrOne
; для функции max()
, что означает, что вы можете полностью отказаться от key
параметра.