1

我遇到了一种情况,我想通过另一个方法列表“减少”一个整数列表。

>>> import operator
>>> 
>>> OPS = [operator.add, operator.sub, operator.add]
>>> nums = [1,2,3,4]
>>> 
>>> OPS[2](OPS[1](OPS[0](nums[0],nums[1]),nums[2]),nums[3])
4

for循环:

>>> result = nums[0]
>>> for i in range(1,len(nums)):
...     result = OPS[i-1](result,nums[i])
... 
>>> print result
4

“队列”:

>>> result = nums.pop(0)
>>> while nums:
...     result = OPS.pop(0)(result, nums.pop(0))
... 
>>> print result
4

如果我只想对数字列表应用一种方法,例如 operator.add,我可以使用 reduce。

>>> reduce(operator.add, [1,2,3,4])
10

组合两个列表,一个运算符和另一个操作数是否有类似的东西?

4

3 回答 3

2

没有。

>>> OPS = [operator.add, operator.sub, operator.add]
>>> nums = [1, 2, 3, 4]
>>> print reduce(lambda x, y: y[0](x, y[1]), zip(OPS, nums[1:]), nums[0])
4
于 2011-04-26T01:07:04.670 回答
1

类似于 Ignacio 的解决方案,但带有迭代器和 izip,并且仅适用于 Python < 3.x:

>>> import operator
>>> import itertools
>>> 
>>> ops = [operator.add, operator.sub, operator.add]
>>> nums = iter([1, 2, 3, 4])
>>> 
>>> print reduce(lambda a, (f, b): f(a, b), itertools.izip(ops, nums), next(nums))
4
于 2011-04-26T02:15:57.000 回答
0
>>> it = iter(OPS)
>>> reduce(lambda *a: next(it)(*a), nums)
4
于 2012-06-18T14:29:32.837 回答