学习python我遇到了以下问题。我已经有一些带整数的列表(例如initial_list
)。然后我尝试使用以下数字模式创建列表(例如result
):
result[len(result) - 1] = 1
result[i] = result[i + 1] * initial_list[i]
示例:
initial_list = [2, 2, 2, 2, 3, 2, 2]
result = [192, 96, 48, 24, 12, 4, 2, 1]
这是我的第一个实现:
import numpy as np
initial_list = [2, 2, 2, 2, 3, 2, 2]
result = [1]
for number in reversed(initial_list):
result.append(result[-1] * number)
result = np.array(result[::-1])
这是我的第二个实施:
import numpy as np
initial_list = [2, 2, 2, 2, 3, 2, 2]
result = np.ones(len(initial_list) + 1)
for i, number in enumerate(reversed(initial_list)):
result[len(result) - i - 2] = result[len(result) - i - 1] * number
我猜第二个更好,因为它不包含append方法并初始化具有大小的列表。 result = np.ones(len(initial_list) + 1)
也包含浮点数,这是不正确的。我想知道这个算法的实现是否有更简单的版本。
在该算法之后,我正在创建OrderedDict
:
from collections import OrderedDict
ordered_dict = OrderedDict(zip(other_list, result))
也许我可以在为result
创建OrderedDict
期间反复O(1)
列表“就像reversed
用于循环一样,以便我可以简化上面的算法。” / p>
答案 0 :(得分:4)
答案 1 :(得分:3)
您可以使用itertools.accumulate
和operator.mul
>>> from itertools import accumulate
>>> from operator import mul
>>> a = [2, 2, 2, 2, 3, 2, 2]
>>> list(accumulate(reversed(a + [1]), mul))[::-1]
[192, 96, 48, 24, 12, 4, 2, 1]
答案 2 :(得分:0)
为什么你不能做
result = [0] * len(initial_list)
result[-1] = 1
for i in xrange(len(result) - 2, -1, -1):
result[i] = result[i + 1] * initial_list[i]