列表中的项目成倍增加?

时间:2017-01-21 20:32:02

标签: python loops primes

我对python来说比较新。 我已经实现了设定金额的所有素数列表。 我试图做的很难解释,所以我只是用一些硬代码来展示它:

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

我需要一些想法,在某种循环中这样做,我已经尝试了好几个小时了。

4 个答案:

答案 0 :(得分:4)

您需要累积产品的列表。这是一个简单的配方:

>>> 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 :(得分:2)

你可以这样做:

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)

(之前的结果是产品加1,所以要重复使用它,只需减去一个)

编辑:其他答案让我意识到我过于复杂化了。存储累积产品的临时变量可能更清晰。

答案 2 :(得分:2)

最明显的做法是使用中间变量来跟踪产品,然后在将其放入列表时添加1。

euclst = []
running_prod = 1
for p in primelst[]:
    running_prod *= p
    euclst.append(running_prod + 1)

答案 3 :(得分:1)

你可以使用这样的东西:

euclst.append(primelst[0])
euclst.append(euclst[-1]*primelst[i])