Python 3.x 编写删除重复元素的程序时,列表索引超出范围
我试图删除重复的元素,但它在l=n[I]处显示列表索引超出范围错误Python 3.x 编写删除重复元素的程序时,列表索引超出范围,python-3.x,Python 3.x,我试图删除重复的元素,但它在l=n[I]处显示列表索引超出范围错误 n=list(input().split()) for i in range(len(n)): l=n[i] for j in range(len(n)): if(j!=i): if(l==n[j]): n.pop(j) print(n) 它显示错误,因为您从内部弹出了元素,这在迭代时改变了列表的大小。但是range函数仍然具有原始长度
n=list(input().split())
for i in range(len(n)):
l=n[i]
for j in range(len(n)):
if(j!=i):
if(l==n[j]):
n.pop(j)
print(n)
它显示错误,因为您从内部弹出了
元素,这在迭代时改变了列表的大小。但是range
函数仍然具有原始长度,因此给出了一个不再存在的索引
在对列表进行迭代时,您应该永远不要更改列表的长度(或字典的键
)
具体来说,让我们看一下您的列表n=[1,1,2,3]
(假设)<代码>i
将在范围(3)
内运行(即取值0,1,2,3
)
现在,l=n[0],即l=1
。然后在j=1,n[j]=1
时,条件l==n[j]
变为true
,您执行n.pop(1)
因此,现在,您的列表n=[1,2,3]
但是您的最外层循环仍然在范围(4)
中,因此当您执行l=n[3]
时会出现错误,因为n[3]
不存在
要避免这种情况,您可以使用以下选项:
列表上的集合
list(input().split())
是对list
构造函数的冗余调用<默认情况下,code>.split()方法返回一个列表。
所以只要n=input().split()
就足够了。这似乎是一个集合的完美用例。您不需要指定n是一个列表,因为.split()会将其转换为一个列表