23

这是我到目前为止编写的代码,程序的重点是从文件中读取 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 方法不是最有效的方法,所以如果您有任何异议,我愿意倾听和学习!

4

1 回答 1

43

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完全删除参数。

于 2013-08-01T21:45:55.503 回答