2009-08-02 5 views
23

非整数の値でsum()を使用する簡単かつ迅速な方法はありますか?pythonのsum()と非整数の値

は、だから私はこのようにそれを使用することができます:

class Foo(object): 
    def __init__(self,bar) 
     self.bar=bar 

mylist=[Foo(3),Foo(34),Foo(63),200] 
result=sum(mylist) # result should be 300 

を私は__add____int__などを上書きしようとしたが、私はまだ解決策を見つけていません

EDIT:

ザ・ソリューションは、実装することです:

def __radd__(self, other): 
    return other + self.bar 

として彼のポストに示唆されるでしょう。しかし、いつものように、すべての道はローマにつながるが、私は私のクラスで

答えて

25

その - 合計()関数は、スタートを取り、次に追加しますので、

にあなたが__radd__メソッドを実装する必要があります。functoolsから

class T: 
    def __init__(self,x): 
     self.x = x 
    def __radd__(self, other): 
     return other + self.x 

test = (T(1),T(2),T(3),200) 
print sum(test) 
+0

map()、reduce()、または追加のモジュールをインポートする必要がないので、__radd__を実装することが最善の解決策だと思います。 – sloth

5

てみ__add__を必要としないので、これが最善の解決策だと思う。おそらくより速く動作します)

import operator 
result=reduce(operator.add, mylist) 

合計を(が、それを組み込み番号にのみ特化しています。もちろん、Foo()オブジェクトを追加するメソッドを提供する必要があります。だから、完全な例:

class Foo(object): 
    def __init__(self, i): self.i = i 
    def __add__(self, other): 
     if isinstance(other, int): 
      return Foo(self.i + other) 
     return Foo(self.i + other.i) 
    def __radd__(self, other): 
     return self.__add__(other) 

import operator 
mylist = [Foo(42), Foo(36), Foo(12), 177, Foo(11)] 
print reduce(operator.add, mylist).i 
+0

は#PY3を減らすインポート –

+0

これは '__add__'を実装しているどの型に対しても機能する、最も汎用的な解決法です。) '、例えば' pint'ライブラリにあるユニットの数量です。 – gerrit

3

__int__メソッドを使用してみてください、その後、値を出すためにint関数にリスト内の各要素をマッピング:

class Foo(object): 
    def __init__(self,bar): 
     self.bar = bar 
    def __int__(self): 
     return self.bar 

mylist = [Foo(3),Foo(34),Foo(63),200] 
result = sum(map(int,mylist)) 
print(result) 
5

またはインポートしない場合何でも、

result=reduce((lambda x,y:x+y), mylist 

もう一つの小さな利点は、あなたが必ずしもを追加宣言する必要はありませんということですメソッドを追加する必要がある唯一の状況である場合は、Fooオブジェクトの一部としてメソッドを追加します。 (しかし、それはおそらくは将来の柔軟性をを追加定義するために損はない。)

16

あなたはまた、「逆アドオン」を表し、引数がで解決することができないときに呼び出される__radd__機能を実装する必要があるかもしれません「前方」方向。たとえば、x + yは可能であればx.__add__(y)と評価されますが、存在しない場合はPythonはy.__radd__(x)を試行します。

sum()関数は整数0から始まるので、それが最初に行うことは、評価しようです:あなたはFoo.__radd__を実装している必要があります

0 + Foo(3) 

。少しトリッキー

関連する問題