python - 如何在循环中更新数组索引(IndexError : list index out of range)

标签 python

我不应该使用高级功能,因为这是面试时的逻辑测试。 尝试删除数组中出现不止一次的所有数字。

测试用例: a=[1,1,2,3,2,4,5,6,7]

代码:

    def dup(a):
      i=0
      arraySize = len(a)
      print(arraySize)
        while i < arraySize:
        #print("1 = ",arraySize)
        k=i+1
          for k in range(k,arraySize):
          if a[i] == a[k]:
          a.remove(a[k])
        arraySize -= 1
        #print("2 = ",arraySize)
      i += 1
    print(a) 

结果应该是:1,2,3,4,5,6,7

但我总是让索引超出范围。我知道这是因为循环内的数组列表改变了,所以“while”初始索引与新索引不同。

问题是:有什么方法可以将新索引长度(循环内的数组)与父循环(“while”循环中的索引)同步?

我唯一能想到的就是在循环中使用函数。

有什么提示吗?

最佳答案

每次迭代重新计算数组大小

看来我们这里有几个问题。第一个问题是您无法在内部循环(range 函数)中更新“停止”值。所以首先,让我们删除它并使用另一个 while 循环让我们能够在每次迭代时重新计算我们的数组大小。

重新检查移入删除列表点的值

下一步,在你修复之后,你会遇到一个更大的问题。当您使用 remove 时,它会从列表末尾移动一个值或将整个列表向左移动以使用已删除的位置,并且您不会重新检查移入旧位置的值值删除现货。为了解决这个问题,我们需要在每次删除元素时递减 i,这确保我们正在检查放置到已删除元素点的值。

removedel

在这种情况下,您应该使用 del 而不是 removeremove 遍历列表并删除第一次出现的值,看起来我们已经知道要删除的值的确切索引。 remove 可能会起作用,但在这里使用它会使事情变得有点复杂。

具有最小变更集的功能代码

def dup(a):
    i = 0
    arraySize = len(a)
    print(arraySize)
    while i < arraySize:
        k = i + 1
        while k < arraySize: # CHANGE: use a while loop to have greater control over the array size.
            if a[i] == a[k]:
                print("Duplicate found at indexes %d and %d." % (i, k))
                del a[i] # CHANGE: used del instead of remove.
                i -= 1 # CHANGE: you need to recheck the new value that got placed into the old removed spot.
                arraySize -= 1
                break
            k += 1
        i += 1
    return a

现在,我想指出上面的代码存在一些可读性和可维护性问题。以我们正在做的方式遍历数组和操作迭代器有点困惑,并且容易出现简单的错误。以下是我以更具可读性和可维护性的方式实现此问题的几种方法。

简单易读的替代方案

def remove_duplicates(old_numbers):
    """ Simple/naive implementation to remove duplicate numbers from a list of numbers. """
    new_numbers = []
    for old_number in old_numbers:
        is_duplicate = False
        for new_number in new_numbers:
            if old_number == new_number:
                is_duplicate = True
        if is_duplicate == False:
            new_numbers.append(old_number)
    return new_numbers

优化的低级替代方案

def remove_duplicates(numbers):
""" Removes all duplicates in the list of numbers in place. """
    for i in range(len(numbers) - 1, -1, -1):
        for k in range(i, -1, -1):
            if i != k and numbers[i] == numbers[k]:
                print("Duplicate found. Removing number at index: %d" % i)
                del numbers[i]
                break
    return numbers

关于python - 如何在循环中更新数组索引(IndexError : list index out of range),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51471228/

相关文章:

Python openCV 2.4.3 cv2.SolvePnP 错误

python - 在文本文件中搜索字符串时如何包含空格

python - 二叉搜索树,逻辑和语法错误

Python - 获取每周、每月、每季度、六个月、每年等的第一个和最后一个观察结果

python - 使用 pandas 从数据框中删除空间

python -++增量运算符的等价物是什么?

python - Pandas load_table 字符串到元组的转换

python - super 应该始终位于 __init__ 方法的顶部,还是可以位于底部?

python - 在 Django 中减去日期时间 - 无输出

python - 删除数据框中每个 ID 的前 n 行