【问题标题】:Getting IndexError: list assignment index out of range in python获取IndexError:python中的列表分配索引超出范围
【发布时间】:2017-07-24 04:49:08
【问题描述】:

我正在尝试从列表 arr 中删除最后 5 个元素,即“%20”:-

arr = ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a', '%20', '%20', '%20', '%20', '%20']
length = 30
print(length)
print(len(arr))
print(arr)
for x in range(length, len(arr)):
    print(arr[x])
for x in range(length, len(arr)):
    del arr[x]
print(arr)

但我得到以下输出。我不明白为什么print(arr[x]) 有效但del arr[x] 无效:-

30
35
['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a', '%20', '%20', '%20', '%20', '%20']
%20
%20
%20
%20
%20
Traceback (most recent call last):
   File "test.py", line 9, in <module>
     del arr[x]
IndexError: list assignment index out of range

【问题讨论】:

    标签: python arrays list python-3.x


    【解决方案1】:

    索引超出范围,因为如果您从原始数组中删除项目,原始数组的大小会减小。

    尝试pop() 删除最后的项目

    arr = ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a', '%20', '%20', '%20', '%20', '%20']
    length = 30
    print(length)
    print(len(arr))
    print(arr)
    for x in range(length, len(arr)):
        print(arr[x])
    for x in range(length, len(arr)):
        arr.pop()
    print(arr)
    

    【讨论】:

      【解决方案2】:

      当您删除每个项目时,列表会变短,因此您的索引会跑到最后。 您可以使用切片符号del arr[length:],这将比 pop 快得多。

      【讨论】:

        【解决方案3】:

        这是因为您正在迭代一个列表,该列表在每次迭代中都会发生变化。

        >>> arr = ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a', '%20', '%20', '%20', '%20', '%20']
        >>> for x in range(length, y):
            del arr[30]
        
        
        >>> arr
        ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a']
        

        python 方式:

        >>> arr = ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a', '%20', '%20', '%20', '%20', '%20']
        
        >>> del arr[30: ]
        >>> arr
        ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a']
        

        【讨论】:

          【解决方案4】:

          您可以使用del arr[x:] 解决此问题error

          arr = ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a', '%20', '%20', '%20', '%20', '%20']
          
          length = 30
          print(length)
          print(len(arr))
          print(arr)
          for x in range(length, len(arr)):
              print(arr[x])
          
          for x in range(length, len(arr)):
              del arr[x:]
          
          print(arr)
          

          【讨论】:

            【解决方案5】:

            其他答案解释了您为什么遇到错误。这个答案解释了一种更简单的方法来做同样的事情。

            如果您知道要删除最后 5 个元素,只需创建一个省略最后 5 个元素的切片。

            arr = ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a', '%20', '%20', '%20', '%20', '%20']
            number_to_remove_from_end = 5
            arr = arr[:-number_to_remove_from_end]
            print(arr)
            

            输出:

            ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a']
            

            或者,如果您真的想使用 del 关键字来确保列表 ID 保持不变,那么以下将起作用

            arr = ['A', 't', 'u', 'l', '%20', 'K', 'r', 'i', 's', 'h', 'n', 'a', '%20', 'P', 'a', 't', 'n', 'a', '%20', 'B', 'i', 'h', 'a', 'r', '%20', 'I', 'n', 'd', 'i', 'a', '%20', '%20', '%20', '%20', '%20']
            number_to_remove_from_end = 5
            del arr[-number_to_remove_from_end:]
            print(arr)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-07-29
              • 2014-10-13
              • 2016-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多