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