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)
解决方案
它显示错误,因为您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]
不存在。
为避免这种情况,您有以下选择:
将非重复元素推送到新列表中。(或者,复制原始列表并从那里弹出)。
如果允许使用,请在
set
上使用 a 。list
另外,旁注:list(input().split())
是对构造函数的冗余调用list
。.split()
方法默认返回一个list
。所以n=input().split()
就够了。
推荐阅读
- if-statement - 如果条件不满足,则保持单元格不变
- php - 我可以在 xamp localhost 上使用 Swift Mailer 发送电子邮件吗
- regex - 验证查询参数并使用正则表达式解析它
- python - 从随机数据中获取正确路径
- json - 读取捆绑的 JSON 数据时如何使用 init(来自解码器:)
- hyperlink - 我正在尝试在 div 标题中向左浮动徽标和向右浮动一组链接
- javascript - 如何让圆总是只接触到彼此的边缘?
- python - 使用 python camelot 库打印表格以用于提取表格
- postgresql - 无法更新 CTE(但 SELECT 有效)?
- c# - C# 非阻塞无限循环在同一个线程中?