2011-04-26 51 views
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(operator.add, [1,2,3,4]) 
10 

是否有類似的組合兩個列表,一個操作符和另一個操作數?

回答

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 
+0

謝謝,希望有更多的 「可讀性」 的解決方案。 – DTing 2011-04-26 02:19:34

1

伊格納西奧的解決方案類似,但與迭代器和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 
0
>>> it = iter(OPS) 
>>> reduce(lambda *a: next(it)(*a), nums) 
4 
相關問題