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