python的总和()和非整数值(python's sum() and non-intege

2019-06-27 13:09发布

有没有办法使用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__等,但我没有找到一个解决办法

编辑:

解决的办法是实行:

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

威尔建议在他的职位。 但一如既往,条条大路通罗马,但我想这是因为我并不需要的最佳解决方案__add__在我的班级

Answer 1:

它是一个有点棘手 - 和()函数将启动,并将其添加到下等

您需要实现__radd__方法:

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)


Answer 2:

您可能还需要实现__radd__功能,它代表“反向添加”,当争论无法在“向前”的方向来解决被调用。 例如, x + y作为评价x.__add__(y)如果可能的话,但如果不存在,Python的尝试y.__radd__(x)

由于sum()函数整数开头0 ,它做的第一件事就是试图评估:

0 + Foo(3)

这将需要您实现Foo.__radd__



Answer 3:

尝试:

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

SUM()的作品可能更快,但它是专门为只内置数字。 当然,你还必须提供添加您的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


Answer 4:

或者,如果你不想输入任何东西,

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

另一个小的优势是,你不必一定声明__add__方法,你的Foo对象的一部分,如果发生这种情况是在你想要做加法的唯一情况。 (但它可能不会伤害定义__add__为未来的灵活性。)



Answer 5:

尝试使用__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)


文章来源: python's sum() and non-integer values
标签: python list sum