gpt4 book ai didi

python - 为什么按索引弹出或删除时会出现 IndexError ?

转载 作者:行者123 更新时间:2023-12-01 04:43:06 25 4
gpt4 key购买 nike

你能告诉我为什么我必须在 try/except 语句中包含这个 if 吗?当我使用列表调用函数时,此方法会引发 IndexError ,其中最后一个元素与列表中的其他元素相同。当最后一个元素在列表中仅显示一次时,不会引发 IndexError。

def unique(n):
for i in range(len(n) - 1, -1, -1):
for j in range(i):
try:
if n[i] == n[j]:
n.pop(i)
except:
pass
return n

>>unique([1, 2, 3, 2, 4])
[1, 2, 3, 4]
>>unique([1, 2, 3, 4, 2])
IndexError

if 语句中没有 try/except:

>>print n[i]
2
>>n.pop(i)
IndexError
>>del n[i]
IndexError

此外,用 try/except 包围 n.pop(i) 不起作用,我必须用它包围整个 if 。为什么?

最佳答案

当你迭代它时,你正在改变它,这从根本上是错误的,并且可能导致未定义的行为。其行为是您修改列表长度而不通知迭代器更改。迭代次数仍将等于列表的原始长度,但实际元素数量可能会更低(如果没有重复项,则可能会更少)。

访问 Python 中不存在的索引通常会引发 IndexError。您的 try/except block 将抑制这种情况,但迭代仍将在原始长度上继续。

可能的解决方案实际上是使用一个集合,它将为您处理唯一性:

def unique(n):
return list(set(n))

或者,保留您的迭代解决方案,创建一个空列表或您将向其分配结果的列表的副本。为了降低时间复杂度,可以将唯一值存储为字典,其中分配值的时间为常数:

def unique(n):
uniques = {}

for i in range(len(n) - 1, -1, -1):
uniques[n[i]] = n[i]

return list(uniques.keys())

如果您关心键的出现顺序,OrderedDict 可以派上用场。

from collections import OrderedDict

def unique(n):
return list(OrderedDict.fromkeys(n))

关于python - 为什么按索引弹出或删除时会出现 IndexError ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30111102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com