首页 > 解决方案 > 编写程序以删除重复元素时列表索引超出范围

问题描述

我正在尝试删除重复的元素,但它在 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)

标签: python-3.x

解决方案


它显示错误,因为您pop来自内部的元素,它在迭代时改变了列表的大小。但是该range函数仍然具有原始长度,因此给出了一个不再存在的索引。

在迭代列表(或字典)时,您永远不应该更改它的长度。keys

详细地说,让我们来看看你的清单n=[1,1,2,3](比如说)。i将运行range(3)(即取值0,1,2,3

现在,l=n[0], i.e. l=1. 然后在j=1, n[j]=1, 情况l==n[j]转而true你做n.pop(1)

所以现在,你的列表n=[1,2,3]但你最外层的循环仍然存在range(4),因此当你这样做时会出错,l=n[3]因为n[3]不存在。

为避免这种情况,您有以下选择:

  1. 将非重复元素推送到新列表中。(或者,复制原始列表并从那里弹出)。

  2. 如果允许使用,请在set上使用 a 。list

另外,旁注:list(input().split())是对构造函数的冗余调用list.split()方法默认返回一个list。所以n=input().split()就够了。


推荐阅读