【问题标题】:Algorithm: IndexError: list index out of range (Python)算法:IndexError:列表索引超出范围(Python)
【发布时间】:2020-04-02 23:41:39
【问题描述】:

我是 python 新手,我想知道为什么我的程序在第 4 行显示“IndexError: list index out of range”。谁能帮忙。

# A is the array and N is the size of the array.
A =[1,78,46,4,34,10,50,2]
N = len(A)
def Algorithm(A,N):
    #B <- Array[N]
    B = A[N]
    B=[0]*N
    for i in range(1,N):
        B[A[i]]+=1
        i=1
    #for i <-- 1 to N
    for j in range(1,N):
    #for k <-- to B[j]
        for k in range(0,B[j]):
            A[i]=j
            i+=1
    return

Algorithm(A,N)
print(A)

错误:

  2 N = len(A)
  3 def Algorithm(A,N):
  4     B = A[N]
  5     B=[0]*N
  6     for i in range(1,N):

IndexError: 列表索引超出范围

【问题讨论】:

  • 列表索引从 0 到包括数组长度减 1。
  • A 有八个元素。 A[8] 不存在,因为 Python 列表是零索引的。 A 的有效索引为 0 到 7。

标签: python algorithm


【解决方案1】:

所以List index out of range 来自B = A[N],因为 N 代表 A 的总长度。 但是,列表元素的索引范围是从 0 到 N-1,这为您提供了长度 (N-1) - 0 + 1 =&gt; N。如果您想将B 分配给A 的最后一个元素,您可以通过B = A[N-1]B = A[-1] 执行此操作,因为负索引从末尾指向列表的元素。但是,如果您重新声明 B = [0] * N,则可以取消第一个分配

【讨论】:

    【解决方案2】:

    在 Python 中,列表的第一个元素被寻址为零而不是一。例如,要访问名为“数字”的列表中的第一个元素,您应该编写 numbers[0] 而不是 numbers[1]

    B = A[N] 中,您试图通过访问A[N] 来处理列表A 的最后一个元素(N 对应于列表A 的长度)。但是,如前所述,您必须从中减一,因为列表从零开始,而不是从一开始。因此,正确的代码应该是B = A[N - 1]

    【讨论】:

    • @Student 如果你能解释一下算法的预期目的会很有帮助,因为虽然我的回答修复了你在问题中提到的错误,但之后还有其他错误我无能为力您无需进一步信息即可修复。例如,在一行中创建 B 并将其赋值为 2(列表 A 中的最后一个元素),然后在下一行中替换 B,因此第一行似乎没有什么意义。
    • 我正在尝试将伪代码算法转换为 python。这是伪代码:` Algo(A,N) B
    • @Student 谢谢我去看看。
    • @Student 您是否考虑过 A 不是数字列表而是列表列表的可能性?我看不出该算法如何有意义,因为B&lt;-Array[N] 行将 B 设置为一个整数(如果我们假设 A 是一个数字列表),然后在算法中它试图将 B 视为一个数组,例如B[1..N]&lt;-0B[A[i]]++.
    • 不,我没有考虑过。
    【解决方案3】:
    A =[1,78,46,4,34,10,50,2]
    N = len(A)       # N = 8
    def Algorithm(A,N):
        B = A[N]     # value of N is 8 and when you try to access A[8] its out of index range since the index is from 0 to 7
        B=[0]*N
        for i in range(1,N):
            B[A[i]]+=1
            i=1
        #for i <-- 1 to N
        for j in range(1,N):
        #for k <-- to B[j]
            for k in range(0,B[j]):
                A[i]=j
                i+=1
        return
    
    Algorithm(A,N)
    print(A)
    

    我想指出我在您的代码中注意到的其他内容。

    A =[1,78,46,4,34,10,50,2]
    N = len(A)       
    def Algorithm(A,N):
        B = A[N]     
        B=[0]*N  # This line overwrites the above assignment. 
        for i in range(1,N):
            B[A[i]]+=1    # B[A[i]]  -- so i guess during execution the A[i] will be a value from list A . hence B[A[i]] might become B[78] , B[46] etc (sorry if i have misunderstood)
            i=1
        #for i <-- 1 to N
        for j in range(1,N):
        #for k <-- to B[j]
            for k in range(0,B[j]):
                A[i]=j
                i+=1
        return
    
    Algorithm(A,N)
    print(A)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-25
      • 2017-04-05
      • 2012-07-15
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多