Python 从另一个列表创建特定列表

Python creating specific list from another list

学习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

我想第二个要好得多,因为它不包含追加方法和用具体大小初始化列表。另外 result = np.ones(len(initial_list) + 1) 包含不正确的浮点数。我想知道这个算法的实现是否有更简单的版本。

在我创建该算法之后 OrderedDict:

from collections import OrderedDict
ordered_dict = OrderedDict(zip(other_list, result))

也许我可以在为 O(1) OrderedDict 创建 OrderedDict 期间反转 result 列表 O(1) "on fly" 就像 reversed 在 for 循环中工作,这样我就可以简化算法以上。

如果numpy is an option, you can do it with cumprod:

import numpy as np

initial_list = [2, 2, 2, 2, 3, 2, 2]

>> np.append(np.cumprod(initial_list[:: -1])[:: -1], [1])
array([192,  96,  48,  24,  12,   4,   2,   1])

您可以使用itertools.accumulate and 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]

你为什么不能做

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]