Что такое функция вычитания, похожая на sum() для вычитания элементов в списке?

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

class Calculator(object):
    def __init__(self, args):
        self.args = args

    def subtract_numbers(self, *args):
        return ***here is where I need the subtraction function to be****

Кроме того, я могу просто использовать return sum(args) для вычисления суммы, но я не уверен, что я могу сделать для вычитаний.


person user1306134    schedule 01.04.2012    source источник
comment
Как бы вы определили функцию subtract? В общем, интуитивно понятно. Вы просто добавляете все числа. Но что касается вычитания, из чего вы вычитаете и что вычитаете?   -  person Squazic    schedule 01.04.2012
comment
Сначала вам нужно определить, какая функция вычитания предназначена для нескольких аргументов. это first_element - sum(rest_of_elements)? Это sum(args[i] * (-1)^1? это abs(max(list) - sum(rest_of_elements))? Как видите, существует бесконечное количество возможностей — что точно вам нужно?   -  person amit    schedule 01.04.2012
comment
Как именно это должно работать? Вы хотите вычесть эти числа в списке из чего?   -  person tchap    schedule 01.04.2012


Ответы (2)


from functools import reduce  # omit on Python 2
import operator

a = [1,2,3,4]

xsum = reduce(operator.__add__, a)  # or operator.add
xdif = reduce(operator.__sub__, a)  # or operator.sub

print(xsum, xdif)
## 10 -8

reduce(operator.xxx, list) в основном "вставляет" оператор между элементами списка.

person georg    schedule 01.04.2012
comment
Есть ли причина, по которой вы предпочитаете версию имен операторов с символами подчеркивания? - person Marcin; 01.04.2012
comment
@Marcin: нет, кроме подчеркивания, это сексуально ;)) - person georg; 01.04.2012

Это зависит именно от того, что вы имеете в виду. Вы можете просто вычесть сумму остальных чисел из первого, например:

def diffr(items):
    return items[0] - sum(items[1:])

Трудно сказать, потому что при вычитании это зависит от порядка, в котором вы вычитаете; однако, если вы вычитаете слева направо, как в стандартном порядке операций:

x0 - x1 - x2 - x3 - ... - xn = x0 - (x1 + x2 + x3 + ... + xn)

что является той же интерпретацией, что и фрагмент кода, определяющий diffr() выше.

Похоже, что в контексте вашего калькулятора x0 может быть вашей промежуточной суммой, а параметр args может представлять числа от x1 до xn. В этом случае вы просто вычтете sum(args) из промежуточной суммы. Может быть, я слишком много читаю в вашем коде... Я думаю, вы поняли, да?

person machine yearning    schedule 01.04.2012