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

时间:2013-08-01 21:44:06

标签: python class python-3.x attributes

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

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

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

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

1 个答案:

答案 0 :(得分:37)

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类(要找到最小值,最大值,排序等等),您可能需要让您的课程< em> orderable 。

要做到这一点,你需要实现{{3>} Python将寻找的一些。通过一些额外的技巧,您可以使用低于和等于操作,并使用basic customization hooks

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参数。