Получить объект с максимальным значением атрибута в списке объектов

Это код, который я написал до сих пор, и точка с программой состоит в том, чтобы прочитать 20 человек из файла, а затем назначить им их атрибуты, а затем нормализовать их значения из ввода, заданного пользователем.

class One:
    def __init__(self):
        self.attrOne = ()
        self.attrTwo = ()
        self.attrThree = ()
        self.attrFour = ()
        self.attrFive= ()
        self.attrSix = ()
        self.attrSeven = ()
        self.attrEight = ()
        self.attrNine = ()


class Two:

    def __init__(self):
        self.allPersons = []

   def importFromList(self, filename): 
       file= open(filename, "rU")
       for line in file:
           partOfList = line.split()                        
           x = Partner() 
           x.attrOne = partOfList[0]
           x.attrTwo = partOfList[1]
           x.attrThree = partOfList[2]
           x.attrFour = partOfList[3]
           x.attrFive = partOfList[4]
           x.attrSix = partOfList[5]
           x.attrSeven = partOfList[6]
           x.attrEight= partOfList[7]
           x.attrNine = partOfList[8]
           self.addPerson(x)
        file.close()

def addPerson(self, x):
    self.allPersons.append(x) 

Я задаюсь вопросом, как перебирать атрибуты людей, которые помещаются во все списки Porsons, а затем сравнивать их с eachother, чтобы узнать максимальное значение. Это то, что я пробовал до сих пор, но я не могу заставить его работать

def getMaxValue(self): 
    o = One()
    for eachPartner in self.allPartners:
        maxValuesAttrOne = max(O.attrOne))

Вся помощь будет оценена, и я открыт для новых решений, также я предполагаю, что метод importFromList не самый эффективный, поэтому, если у вас есть какие-либо возражения, я готов слушать и учиться!

Ответ 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 параметра.