重新计算每次迭代的数组大小
看起来我们有几个问题。首先,您无法在内部循环(range
函数)中更新“stop”值。因此,首先让我们删除它,并使用另一个while循环,使我们能够在每次迭代中重新计算数组大小。
重新检查移除列表位置的值
接下来,在您解决这个问题后,您将遇到一个更大的问题。当您使用remove
时,它会将值从列表末尾移动或将整个列表向左移动以使用已删除的位置,而您没有重新检查移动到旧值已被删除的位置的值。为了解决这个问题,我们需要在删除元素时递减i
,这确保我们正在检查放置到已删除元素位置的值。
remove
与del
在这种情况下,您应该使用del
而不是remove
。 remove
遍历列表并删除第一次出现的值,而我们似乎已经知道要删除的值的确切索引。 remove
可能有效,但在这里使用它会使事情变得过于复杂。
最小更改功能代码
def dup(a):
i = 0
arraySize = len(a)
print(arraySize)
while i < arraySize:
k = i + 1
while k < arraySize:
if a[i] == a[k]:
print("Duplicate found at indexes %d and %d." % (i, k))
del a[i]
i -= 1
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
list(set(a))
。 - idjaw