所以这是问题,我用Python语言实现了它,但代码中有错误,我无法修复它,所以请帮助。我也在添加代码。
def delete23(a):
for i in range(0, len(a) - 1):
for j in range(0, len(a) - 1):
if a[i] == a[j] and i != j:
a.pop(j)
print(a)
a = [1, 2, 3, 4, 4, 1, 7]
print(len(a))
delete23(a)
4条答案
按热度按时间wswtfjt71#
当你在列表中向前迭代时,你不能“弹出”值,因为下一个索引将被跳过(因为后续的项被移动了一个位置),列表的长度将减少,这会导致你的循环越界。
如果你以索引的相反顺序处理列表,这不会是一个问题,因为移位的位置只会在你已经处理过的索引上(只要你从外部循环
i
而不是j
弹出索引)。例如:
或者,您可以使用字典来过滤掉重复项(仅保留唯一键并保持原始顺序):
如果不需要保留顺序,则可以使用set。
kqlmhetl2#
为了在保持顺序的同时过滤重复项,经常使用一组可见值。逻辑很简单:如果一个值还没有出现在SEEN中,则该值是第一次遇到。
通过一个小技巧,可以缩短:
解释(...)中的表达式:
set.add
返回None
,(None or VALUE)
的计算结果为VALUE
警告:所有使用set或dict的解决方案都要求所有值都是可散列的。
cnwbcb6i3#
我也在考虑
dict.fromkeys()
,但是,@Alain已经回答得很好了。more_itertools
中有一个方法可以保持顺序。wnrlj8wa4#