1

私はカスタムデータ型を持っています。たとえば、29:mytime45のように時間と分を表します。これは29時間45分です。

組み込み関数を使用して、すべてのリストにタイプmaxの値が含まれている、要素の合計が最大であるリストのリストからアイテムを検索したいと思います。mytime

x = [[a, b], [c, d]]

a、b、c、dはmytimeタイプです。

max(x, key=sum) 

a、b、c、dは整数ではないため、ここでは機能しません。

Pythonコマンドラインで入力a + bすると、これら2つの時間値の合計が得られ、結果はmytimeエラーなしのタイプになります。

maxここで関数を使用するにはどうすればよいですか?

4

3 に答える 3

4

クラスが次のようになっているとします。

class mytime(object):

    def __init__(self, h, m):
        self.h = h
        self.m = m

    def __add__(self, other):
        return mytime(self.h + other.h, self.m + other.m)

    def __repr__(self):
        return '%i:%i' % (self.h, self.m)

次のように使用します。

a = mytime(10, 10)        
b = mytime(2, 22)
print a + b 

期待どおりに動作します:

12:32


問題:

あなたがしたいことは次のとおりです。

l = [a, b]
print sum(l)

しかし、それは失敗します:

TypeError: + のサポートされていないオペランド型: 'int' および 'mytime'

問題は、sum関数が開始0され、リストのすべての値を合計することです。評価しようとするだろう

0 + mytime(10, 10)    

これは失敗します。


解決:

問題の解決策は、__radd__「逆加算」を表し、引数を「順方向」に解決できない場合に呼び出される関数を実装することです。たとえば、x + yは可能であると評価されx.__add__(y)ますが、それが存在しない場合、Python は を試みy.__radd__(x)ます。

したがって、次のメソッドをクラスに追加できます。

def __radd__(self, other):
    return mytime(self.h, self.m)

そしてsum関数はあなたのために働きます(この実装ではother値を無視していますが、あなたの場合はおそらく問題ありません)。

于 2012-07-17T11:56:35.593 に答える
1

a + b本当に作品を使用していますか?すべてsumが隣接する要素に繰り返し適用されます (文字列を分割する特殊なケースと+同じです)...したがって、それが機能する場合は比較演算子をサポートしている限り、機能するはずです-たとえば、、reduce(operator.add, sequence)max(x, key=sum)mydate__gt____eq____lt__

__gt__max が機能するように定義する必要があります...

class mydate(object):
    def __init__(self, num):
        self.num = num
    def __add__(self, other): # make sure sum works
        return self.num + other.num
    def __gt__(self, other): # make sure max can do > comparison
        return self.num > other.num
    def __repr__(self):
        return 'date: {}'.format(self.num)


x = mydate(3)
y = mydate(5)
z = mydate(2)

print max([x,y,z], key=sum)
于 2012-07-17T10:02:25.817 に答える
1

独自の sum 関数を作成できます。

def my_sum(item):
    return sum(60 * e[0] + e[1] for e in item)

x = [[(2,0), (3,0)], [(9, 0), (4, 0)]]
print max(x, key=my_sum)

データ構造を (時間と分を含む) タプルとして表したので、mytimeデータ構造に合わせて調整する必要があるかもしれませんmy_sum。唯一の要件は、a の時間と分をそれぞれおよびmytimeに入力できることです。e[0]e[1]

上記のコードは、最大の要素 (この場合は[(9, 0), (4, 0)]) を返します。

于 2012-07-17T10:12:27.913 に答える