【问题标题】:Getting index out of range in python在python中使索引超出范围
【发布时间】:2020-08-02 19:26:47
【问题描述】:

我刚开始使用 Python,我遇到了这个问题。 检查整数数组并消除所有重复值。不同的整数都移到数组的左边

我正在尝试查找数组中的所有重复条目,将其删除,然后将其余项目向左移动。

这是我编写的代码,我只是不知道出了什么问题以及它是如何超出索引的,我尝试用 C++ 编写它,它工作正常。任何人都可以帮助我并向我解释它是如何脱离索引的。

array = [2,2,3,5,2,5,6,2,4,8,3,36,8,2]

for i in range(len(array)-1,-1,-1):
    for j in range(0,i):
        if(array[j]==array[i]):
            del array[i]
            
print(array)

预期的输出是

[2, 3, 5, 6, 4, 8, 36]

【问题讨论】:

  • 预期输出是什么? [2, 3, 5, 6, 4, 8, 36]?
  • 是的,这是预期的输出。

标签: python arrays jupyter-notebook


【解决方案1】:

在找到另一个具有相同值的元素后删除当前索引处的元素后,您需要将break 退出循环,因为i 不再引用相同的元素。 Demo

array = [2,2,3,5,2,5,6,2,4,8,3,36,8,2]
 
for i in range(len(array)-1,-1,-1):
    for j in range(0,i):
        if(array[j]==array[i]):
            del array[i]
            break
print(array)

【讨论】:

  • 谢谢,效果很好。我不知道我是怎么错过的:-)
  • @SarthakDhonchak 没问题。
  • 这种情况可能是您连续三个或更多重复的问题。我认为最好检查列表的大小。
  • @AndrejZacharevicz 即使连续三个或更多重复,它也能正常工作:ideone.com/afILK5
【解决方案2】:

发生这种情况是因为您正在遍历数组(或列表)直到最后一个索引并同时更改它的长度。您在循环开始时创建的范围对列表大小的更改一无所知。如果您选择手动控制当前索引,您将有办法避免它。但这有点不像 Python,因为看起来设计过度了。

您可以通过其他方式执行相同的任务来避免此问题并使用 Python 的强大功能。例如,您可以使用set 过滤所有重复项:

array = [2,2,3,5,2,5,6,2,4,8,3,36,8,2]

results = set(array)
print(result)

但是,正如我在下面的 cmets 中指出的那样,这很可能会更改列表中元素的顺序。b如果您需要删除重复项,但保持顺序不变,这绝对不是最好的方法。

或者您可以使用另一个列表来存储结果:

array = [2,2,3,5,2,5,6,2,4,8,3,36,8,2]
results = []

for number in array:
    if number not in results:
        results.append(number)

print(results)

【讨论】:

  • 你的意思是if number not in results
  • 另外,如果需要保留顺序,第二个示例很好,只是速度较慢。我也会添加一个seen 集并检查if number not in seen
  • @BrianMcCutchon 是的,我忘记了集合中的订单问题。感谢您指出这一点。你提出了一种使用 set 并保存列表顺序的好方法!
【解决方案3】:

在第一次迭代中,i 指向最后一个元素,j 指向第一个元素。因为它们是相同的,所以您删除了数组的一个元素。现在数组比以前少了一个元素,i 指向的元素不再存在。因此,您会得到索引错误。

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2019-11-29
    相关资源
    最近更新 更多