列表的累积乘积
Cumulative product of a list
我已经实现了一个包含一定数量的所有质数的列表。
我想做的事情很难解释,所以我会用一些硬代码来展示它:
euclst = []
euclst.append((primelst[0]) + 1)
euclst.append((primelst[0] * primelst[1]) + 1)
euclst.append((primelst[0] * primelst[1] * primelst[2]) + 1)
....
所以基本上我试图从我的上一个列表中按顺序取出一个元素,然后按指数乘以我猜并将它附加到我的另一个列表中。
我意识到我可以这样做,这可能更容易:
euclst = []
euclst.append(primelst[0])
euclst.append(primelst[0] * primelst[1])
euclst.append(primelst[0] * primelst[1] * primelst[2])
....
#then add one to each element in the list later
我需要一些想法来在某种循环中执行此操作。
你可以使用这样的东西:
euclst.append(primelst[0])
euclst.append(euclst[-1]*primelst[i])
你可以这样做:
euclst = [primelst[0]]
for p in primelst[1:]:
euclst.append(euclst[-1]*p)
- 用第一个元素初始化你的列表
- 循环并使用前一个追加元素追加当前元素
(由于当前结果取决于之前的结果,因此在列表理解中不容易做到)
要解决带有+1
的更复杂的问题:
euclst = [primelst[0]+1]
for p in primelst[1:]:
euclst.append((euclst[-1]-1)*p+1)
(之前的结果是乘积加一,所以要重复使用,减一即可)
编辑:其他答案让我意识到我把事情复杂化了。存储累积产品的临时变量可能会更干净。
您想要累积产品的列表。这是一个简单的食谱:
>>> primelist = [2, 3, 5, 7, 11, 13, 17, 19, 23]
>>> euclist = []
>>> current = 1
>>> for p in primelist:
... current *= p
... euclist.append(current)
...
>>> euclist
[2, 6, 30, 210, 2310, 30030, 510510, 9699690, 223092870]
>>>
另一种方式,使用 itertools:
>>> import itertools
>>> import operator
>>> list(itertools.accumulate(primelist, operator.mul))
[2, 6, 30, 210, 2310, 30030, 510510, 9699690, 223092870]
>>>
或者,也许这就是你的意思:
>>> [x + 1 for x in itertools.accumulate(primelist, operator.mul)]
[3, 7, 31, 211, 2311, 30031, 510511, 9699691, 223092871]
相当于for-loop:
>>> euclist = []
>>> current = 1
>>> for p in primelist:
... current = current*p
... euclist.append(current + 1)
...
>>> euclist
[3, 7, 31, 211, 2311, 30031, 510511, 9699691, 223092871]
>>>
最清楚的做法可能是使用一个中间变量来跟踪产品,然后在将其放入列表时添加 1。
euclst = []
running_prod = 1
for p in primelst[]:
running_prod *= p
euclst.append(running_prod + 1)
我已经实现了一个包含一定数量的所有质数的列表。 我想做的事情很难解释,所以我会用一些硬代码来展示它:
euclst = []
euclst.append((primelst[0]) + 1)
euclst.append((primelst[0] * primelst[1]) + 1)
euclst.append((primelst[0] * primelst[1] * primelst[2]) + 1)
....
所以基本上我试图从我的上一个列表中按顺序取出一个元素,然后按指数乘以我猜并将它附加到我的另一个列表中。
我意识到我可以这样做,这可能更容易:
euclst = []
euclst.append(primelst[0])
euclst.append(primelst[0] * primelst[1])
euclst.append(primelst[0] * primelst[1] * primelst[2])
....
#then add one to each element in the list later
我需要一些想法来在某种循环中执行此操作。
你可以使用这样的东西:
euclst.append(primelst[0])
euclst.append(euclst[-1]*primelst[i])
你可以这样做:
euclst = [primelst[0]]
for p in primelst[1:]:
euclst.append(euclst[-1]*p)
- 用第一个元素初始化你的列表
- 循环并使用前一个追加元素追加当前元素
(由于当前结果取决于之前的结果,因此在列表理解中不容易做到)
要解决带有+1
的更复杂的问题:
euclst = [primelst[0]+1]
for p in primelst[1:]:
euclst.append((euclst[-1]-1)*p+1)
(之前的结果是乘积加一,所以要重复使用,减一即可)
编辑:其他答案让我意识到我把事情复杂化了。存储累积产品的临时变量可能会更干净。
您想要累积产品的列表。这是一个简单的食谱:
>>> primelist = [2, 3, 5, 7, 11, 13, 17, 19, 23]
>>> euclist = []
>>> current = 1
>>> for p in primelist:
... current *= p
... euclist.append(current)
...
>>> euclist
[2, 6, 30, 210, 2310, 30030, 510510, 9699690, 223092870]
>>>
另一种方式,使用 itertools:
>>> import itertools
>>> import operator
>>> list(itertools.accumulate(primelist, operator.mul))
[2, 6, 30, 210, 2310, 30030, 510510, 9699690, 223092870]
>>>
或者,也许这就是你的意思:
>>> [x + 1 for x in itertools.accumulate(primelist, operator.mul)]
[3, 7, 31, 211, 2311, 30031, 510511, 9699691, 223092871]
相当于for-loop:
>>> euclist = []
>>> current = 1
>>> for p in primelist:
... current = current*p
... euclist.append(current + 1)
...
>>> euclist
[3, 7, 31, 211, 2311, 30031, 510511, 9699691, 223092871]
>>>
最清楚的做法可能是使用一个中间变量来跟踪产品,然后在将其放入列表时添加 1。
euclst = []
running_prod = 1
for p in primelst[]:
running_prod *= p
euclst.append(running_prod + 1)