Значения 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__
в моем классе
Ответы
Ответ 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)