【问题标题】:Cumulative product of a list列表的累积产品
【发布时间】:2017-01-21 20:32:02
【问题描述】:

我已经实现了一个设定数量的所有素数的列表。 我正在尝试做的事情很难解释,所以我将用一些硬代码来展示它:

euclst = []
euclst.append((primelst[0]) + 1)
euclst.append((primelst[0] * primelst[1]) + 1)
euclst.append((primelst[0] * primelst[1] * primelst[2]) + 1)
....

所以本质上,我试图从我的 prev 列表中按顺序获取一个元素,并将它以指数方式相乘,然后将其附加到我的另一个列表中。

我意识到我可以这样做,这可能更容易:

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

我需要一些想法来以某种循环方式执行此操作。

【问题讨论】:

    标签: python list multiplication accumulate


    【解决方案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 循环:

    >>> euclist = []
    >>> current = 1
    >>> for p in primelist:
    ...     current = current*p
    ...     euclist.append(current + 1)
    ...
    >>> euclist
    [3, 7, 31, 211, 2311, 30031, 510511, 9699691, 223092871]
    >>>
    

    【讨论】:

      【解决方案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)
      

      (前面的结果是乘积加一,所以要重复使用,只需减一)

      编辑:其他答案让我意识到我把事情复杂化了。存储累积产品的临时变量可能会更干净。

      【讨论】:

        【解决方案3】:

        使用中间变量来跟踪产品可能是最清楚的,然后在列表中添加 1。

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

        【讨论】:

          【解决方案4】:

          你可以使用这样的东西:

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

          【讨论】:

            猜你喜欢
            • 2017-03-07
            • 1970-01-01
            • 2019-03-30
            • 1970-01-01
            • 2016-12-27
            • 1970-01-01
            • 2021-07-21
            • 2015-02-04
            • 2017-05-25
            相关资源
            最近更新 更多