Подтвердить что ты не робот

Значения python sum() и нецелые значения

Есть ли простой и быстрый способ использования 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

как предложит в своем посте. Но, как всегда, все дороги ведут в Рим, но я думаю, что это лучшее решение, так как мне не нужен __add__ в моем классе

4b9b3361

Ответ 1

Его немного сложно - функция sum() берет начало и добавляет его к следующему и так далее.

Вам нужно реализовать метод __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)

Ответ 2

Вам также может потребоваться реализовать функцию __radd__, которая представляет "обратное добавление" и вызывается, когда аргументы не могут быть разрешены в "прямом" направлении. Например, x + y оценивается как x.__add__(y), если это возможно, но если это не существует, то Python пытается y.__radd__(x).

Так как функция sum() начинается с целого числа 0, первое, что она делает, это попытаться оценить:

0 + Foo(3)

который потребует, чтобы вы реализовали Foo.__radd__.

Ответ 3

Try:

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

Ответ 4

Или, если вы не хотите ничего импортировать,

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

Еще одно небольшое преимущество заключается в том, что вам необязательно объявлять метод добавить как часть ваших объектов Foo, если это единственное обстоятельство, в котором вы хотели бы сделать дополнение, (Но, вероятно, не помешало бы определить добавить для будущей гибкости.)

Ответ 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)