我遇到了一种情况,我希望通过另一种方法列表“减少”一个整数列表。
>>> 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
是否有类似的结合两个列表,一个运算符和另一个操作数?
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
>>> it = iter(OPS)
>>> reduce(lambda *a: next(it)(*a), nums)
4