在对象列表中获取具有max属性值的对象

Fil*_*lip 14 python attributes class python-3.x

这是我到目前为止编写的代码,程序的要点是从文件中读取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) 
Run Code Online (Sandbox Code Playgroud)

我想知道如何循环遍历allPersons列表中的人员的属性,然后将它们相互比较以找出最大值.这是我到目前为止所尝试的,但我无法让它工作

def getMaxValue(self): 
    o = One()
    for eachPartner in self.allPartners:
        maxValuesAttrOne = max(O.attrOne))
Run Code Online (Sandbox Code Playgroud)

所有的帮助将不胜感激,我愿意接受新的解决方案,而且我认为importFromList方法不是最有效的方法,所以如果你有任何反对意见我愿意倾听和学习!

Mar*_*ers 38

max()接受一个key参数,一个函数,当传递其中一个对象时,返回比较它们的值.

使用operator.attrgetter()获得该值:

from operator import attrgetter

max(self.allPartners, key=attrgetter('attrOne'))
Run Code Online (Sandbox Code Playgroud)

这将返回该属性为最大值的匹配对象.如果您只想存储该最大值,您有两种选择:

如果您发现需要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
Run Code Online (Sandbox Code Playgroud)

现在你的One课程是可以订购的,完全基于attrOne; 对于该max()函数,这意味着您可以key完全删除参数.

  • 为了记录,`itemgetter`用于项目访问.`dictionary ['somekey']`或`alist [1]`是项访问的示例,`itemgetter`可调用用于那些.另一方面,属性访问是`someobject.attrOne`,你可以使用`attrgetter`.无论如何都试图使用`itemgetter`会引发一个`TypeError`,因为你的类没有定义`__getitem__`方法...... (2认同)