ошибка неподдерживаемого типа операнда при добавлении объектов в список с помощью функции sum - PullRequest
0 голосов
/ 11 января 2019

У меня реализован класс Serie для представления серии данных и их тега. Когда я добавляю Serie объекты, а также числа, я получаю ожидаемый результат. Однако, когда я объединяю одни и те же элементы в списке, я получаю следующее сообщение об ошибке:

TypeError: неподдерживаемые типы операндов для +: 'int' и 'Serie'

Пример кода игрушки

В качестве примера кода игрушки, чтобы понять проблему, которую мы можем использовать:

import pandas as pd
import numpy as np

class Serie(object):

    def __str__(self):

        s = "> SERIE " + str(self.tag) + ": \n"
        s += str(self.data)
        return s

    def __init__(self, tag=None, data=pd.DataFrame()):
        """
        Creates object Serie

        @type tag: str
        @param tag: Tag for the Serie
        """
        self.tag = tag
        self.data = data

    def __add__(self, other):
        if isinstance(other, int) or isinstance(other, float):
            tag = str(other) + "+" + self.tag
            serie = Serie(tag)
            serie.data = self.data + other
        else:
            try:
                tag = self.tag + "+" + other.tag
            except:
                print ("ERROR: You can't add to somehing that is not a Serie or a number." )
                return None
            serie = Serie(tag)
            serie.data = self.data + other.data
        return serie

s1 = Serie("fibonacci",pd.Series([1,1,2,3,5,8]))
s2 = Serie("2power",pd.Series(np.linspace(1,6,6)**2))
s3 = 10
sumSerie = s1+s2+s3
print sumSerie

Это печатает результат как ожидалось:

>>> 
> SERIE 10+fibonacci+2power: 
0    12.0
1    15.0
2    21.0
3    29.0
4    40.0
5    54.0
dtype: float64

Ошибка при использовании суммы объектов в списке

Однако, когда я запускаю следующие строки:

l = [s1,s2,s3]
sum(l)

Я получаю сообщение об ошибке:

сумма (л) Ошибка типа: неподдерживаемые типы операндов для +: 'int' и 'Serie'

И то же сообщение об ошибке отображается при запуске:

l2 = [s1,s2]
sum(l2)

Но в списке l2 нет переменной int.

Вопросы

Почему отображается это сообщение об ошибке? Это сбивает с толку, так как я смог суммировать объекты за пределами списка.

Есть ли что-то, что я могу сделать, чтобы добиться выполнения суммы объектов в списке?

EDIT

Как предлагается в комментариях, я добавил __radd__, чтобы корректно перегрузить метод add. Поэтому я добавил следующие строки в класс Serie:

def __radd__(self,other):
    return self.__add__(other)

Тогда сумма работает. Но не так, как ожидалось.

Если я запускаю следующий код:

>>> print sum(l)

Я получаю этот вывод:

> SERIE 10+0+fibonacci+2power: 
0    12.0
1    15.0
2    21.0
3    29.0
4    40.0
5    54.0
dtype: float64

Что, безусловно, не то, что я ожидал. В теге есть +0 extra. Как это может быть? Однако, если я использую опцию, которую я указал в своем ответе print np.array(l).sum(), результат будет правильным.

РЕДАКТИРОВАТЬ 2

После корректной перегрузки метода сложения мне предложили использовать метод ниже для выполнения суммы, как ожидалось:

reduce(lambda a, b: a+b, l)

Этот подход работал, чтобы иметь возможность использовать функцию sum для списка и получить правильный результат.

Как указано pault в комментариях к sum метод "start default on 0", как подробно описано в документации функции sum . Вот почему дополнительный тег +0 был добавлен в тег ранее.

В заключение, я считаю, что я бы предпочел использовать опцию, используя вместо этого функцию numpy.sum:

np.array(l).sum()

1 Ответ

0 голосов
/ 11 января 2019

Не уверен, почему использование функции суммы невозможно. Но обходной путь для получения желаемого результата из списков заключается в создании массива numpy из списка и использовании функции numpy.sum, как показано ниже:

np.array(l).sum()

Это дает сумму объектов из списка, как и ожидалось.

...