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()オブジェクトの 1 つが渡されると、オブジェクトを比較するためのkey値を返す関数です。

operator.attrgetter()その値を取得するために使用します。

from operator import attrgetter

max(self.allPartners, key=attrgetter('attrOne'))

これは、その属性が最大である一致するオブジェクトを返します。その最大値自体を保存したい場合は、次の 2 つのオプションがあります。

  • 返されたオブジェクトから属性を取得します。

    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 に答える