您可以使用功能内置的reduce
. 它将重复(或递归)应用一个函数 - 这里是一个匿名 lambda - 在一个值列表上,建立一些聚合:
>>> reduce(lambda x, y: x * (y + 1), [1, 2, 3])
12
这相当于:
>>> (1 * (2 + 1)) * (3 + 1)
12
如果您需要另一个初始值,可以将其作为最后一个参数传递给 reduce:
>>> reduce(lambda x, y: x * (y + 1), [1, 2, 3], 10)
240
>>> (((10 * (1 + 1)) * (2 + 1)) * (3 + 1))
240
就像@DSM 在评论中指出的那样,您可能想要:
>>> reduce(lambda x, y: x * (y + 1), [1, 2, 3], 1) # initializer is 1
可以使用operator模块和生成器表达式更简洁地编写为:
>>> from operator import mul
>>> reduce(mul, (v + 1 for v in d.values()))
我会猜到,生成器变体更快,但在 2.7 上似乎不是(至少对于非常小的字典):
In [10]: from operator import mul
In [11]: d = {'a' : 1, 'b' : 2, 'c' : 3}
In [12]: %timeit reduce(lambda x, y: x * (y + 1), d.values(), 1)
1000000 loops, best of 3: 1 us per loop
In [13]: %timeit reduce(mul, (v + 1 for v in d.values()))
1000000 loops, best of 3: 1.23 us per loop