获取索引器:在python中列表分配索引超出范围

获取索引器:在python中列表分配索引超出范围,python,arrays,list,python-3.x,Python,Arrays,List,Python 3.x,我正在尝试从列表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(le

我正在尝试从列表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
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
回溯(最近一次呼叫最后一次):
文件“test.py”,第9行,在
德尔阿尔[x]
索引器:列表分配索引超出范围

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

请尝试
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)

删除每个项目时,列表将变短,因此索引将从末尾开始运行。
您可以使用slice notation
del arr[length://code>,这将比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']
>>> 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']
肾盂道:

>>> 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']

您可以使用
del arr[x:][/code>来解决此
错误

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个元素的切片

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)