Python 3.x 编写删除重复元素的程序时,列表索引超出范围

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函数仍然具有原始长度

我试图删除重复的元素,但它在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=[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()会将其转换为一个列表