【问题标题】:Is a python list a circular data structure?python列表是循环数据结构吗?
【发布时间】:2018-02-26 10:29:45
【问题描述】:

我在 python 代码中的某个时刻感到困惑,我正在尝试构建一个返回累积和的程序,即第 i 个元素是原始列表中第一个 i+1 个元素的太阳。所以[1,2,3]的累积总和是[1,3,6],我试图构建程序及其工作,但对于第一个元素,它添加最后一个元素作为前一个元素,这让我认为这是python列表的结构什么圈子??

h=[]
a=[1,2,3,4,5,6]
for i in range(len(a)):
  d=a[i]+(a[i-1]+1)
  h.append(d)

print(h)

结果

[8, 4, 6, 8, 10, 12]

【问题讨论】:

  • 您需要为累积值保留一个单独的变量。您将无法仅从输入列表中的前一个元素计算它。
  • 您可能打算从a 中获取当前元素,从h 中获取前一个元素,从而累积总和。然而,在h 为空的情况下启动算法有一个明显的问题。因此,像 Paul 提到的那样保留一个单独的变量是最简单的方法。
  • 不,“结构”不是圆形的,而是从后面开始的负索引。 IE。 my_list[len(my_list) - 1] == my_list[-1]
  • 另外值得注意的是,您可以使用itertools.accumulate 来实现这一点,即list(accumulate(a))

标签: python list indexing


【解决方案1】:

罪魁祸首是 a[i - 1] 在第 0th 次迭代:

d = a[i] + (a[i - 1] + 1)

实际发生的情况是i - 1 被缩减为-1,而在python 中,a[-1] 指的是列表中的最后一个元素:

In [568]: l = [1, 2, 3, 4]

In [569]: l[-1]
Out[569]: 4

这里的解决方案是从 1 开始循环。或者,您可以考虑使用临时变量,如 mentioned here

a = [1, 2, 3, 4, 5, 6]
h = []
cumsum = 0
for i in a:
    cumsum += i
    h.append(cumsum)

print(h)
[1, 3, 6, 10, 15, 21]

另一方面,如果您使用numpy,这就像使用np.cumsum 进行单个函数调用一样简单:

h = np.cumsum([1, 2, 3, 4, 5, 6])
print(h)
array([ 1,  3,  6, 10, 15, 21]) 

【讨论】:

    【解决方案2】:

    只是想补充一点,您可以使用itertools.accumulate 来累积二元运算的结果,在本例中为加法。注意,itertools.accumulate 实际上默认为加法

    >>> a = [1, 2, 3, 4, 5, 6]
    >>> a = [1, 2, 3, 4, 5, 6]
    >>> import itertools
    >>> list(itertools.accumulate(a))
    [1, 3, 6, 10, 15, 21]
    

    但你可以传递给它一个二元运算并做一个累积乘积,例如:

    >>> list(itertools.accumulate(a ,lambda x, y: x*y))
    

    更好的是,利用operator 模块的强大功能:

    >>> list(itertools.accumulate(a, operator.add)) #cumulative sum
    [1, 3, 6, 10, 15, 21]
    >>> list(itertools.accumulate(a, operator.mul)) #cumulative product
    [1, 2, 6, 24, 120, 720]
    >>> list(itertools.accumulate(a, operator.truediv)) #cumulative quotient
    [1, 0.5, 0.16666666666666666, 0.041666666666666664, 0.008333333333333333, 0.001388888888888889]
    >>> list(itertools.accumulate(a, operator.floordiv)) #cumulative floor div
    [1, 0, 0, 0, 0, 0]
    

    【讨论】:

      【解决方案3】:

      是的 - 有点像那样。在 python 中,a[-1] 为您提供列表的最后一个元素。

      如果您使用第一项作为结果的种子,则可以使您的代码从 1 而不是 0 开始工作:

      a=[1,2,3,4,5,6]
      h=[a[0]]
      for i in range(1,len(a)):
        d=a[i]+(h[i-1])
        h.append(d)
      
      print(h)
      

      【讨论】:

        【解决方案4】:

        列表不是循环的,但可以从开头或结尾引用。您可以使用 [-1] 从列表末尾引用。

        但是,如果您尝试引用只有 10 个元素的列表的第 20 个元素,则会收到错误消息。如果列表是循环的,它将引用第 10 个元素,但它不是。

        我相信你想要的是这个:

        a = [1,2,3,4,5,6]
        h = []
        
        index = 0
        for i in range(len(a) - 1):
            first =  a[index]
            second = a[index + 1]
            summation = first + second
            h.append(summation)
            index += 1
        
        print(h)
        

        【讨论】:

          猜你喜欢
          • 2011-04-28
          • 1970-01-01
          • 2019-05-25
          • 1970-01-01
          • 1970-01-01
          • 2016-01-07
          • 1970-01-01
          • 2017-10-11
          • 1970-01-01
          相关资源
          最近更新 更多