Python 3:在迭代上应用运算符

时间:2012-08-14 22:51:50

标签: python python-3.x operators iterable

sum(iterable)实际上是:

def sum(iterable):
    s = 0
    for x in iterable:
        s = s.__add__(x)
    return s

Python是否有内置函数可以在不设置初始值的情况下完成此操作?

# add is interchangeable with sub, mul, etc.
def chain_add(iterable):
    iterator = iter(iterable)
    s = next(iterator)
    while True:
        try:
            s = s.__add__(next(iterator))
        except StopIteration:
            return s

我对sum的问题是,它不适用于支持+运算符的其他类型,例如Counter

3 个答案:

答案 0 :(得分:8)

尝试查看python reduce() function:传入一个函数,一个可迭代的和一个可选的初始化器,它会将该函数累加到所有值。

例如:

import functools
def f(x,y):
    return x+y

print functools.reduce(f, [1, 2, 3, 4]) # prints 10
print functools.reduce(f, [1, 2, 3, 4], 10) # prints 20, because it initializes at 10, not 0.

您可以根据您的iterable更改函数,因此它可以自定义。

答案 1 :(得分:2)

在补充的情况下:

import operator
reduce(operator.add, iterable)

这将适用于无法使用sum一起添加的迭代。同样,您可以使用

执行乘法运算
reduce(operator.mul, iterable)

答案 2 :(得分:2)

这对reduce()非常有用,在Python 3中已移至functools.reduce()

以下是链接乘法的示例:

import functools
import operator

def chain_mul(iterable):
    return functools.reduce(operator.mul, iterable)

您可以使用operator模块中的其他函数替换operator.mul,或者只定义您自己的双参数函数,该函数对其参数进行操作。