列出arr = [1,3,4,5,2,3,4,2,5,7,3,8,1,9,6,2,1,2,1,3,4,3,4,6,9]
想要删除重复的值,以便原始列表应包含所有元素的单个实例。不想创建额外的列表并附加列表中的元素。也不想使用内置的“设置”。
尝试使用以下代码执行此操作:
l = len(arr)
for x in range(l):
for y in range(x+1,l):
if arr[x] == arr[y]:
del arr[y]
尝试了上面的代码及其抛出错误
"IndexError: list index out of range"
我理解的是,删除列表大小正在改变的值会导致错误。所以我做了以下更改。但它仍然失败了同样的错误:
l = len(arr)
for x in range(l):
for y in range(x+1,l):
if arr[x] == arr[y]:
t = y
del arr[y]
y = t - 1
有人可以帮我解决这个问题吗? 在此先感谢。
答案 0 :(得分:1)
您正试图通过在局部变量l
中缓存列表的长度来提高代码效率。但是,这没有用,因为在循环中修剪了列表,并且您没有保持缓存的长度变量同步。
for index in range(len(arr)-1,0,-1):
if arr[index] in arr[:index]:
del arr[index]
通过向后遍历数组并查找每个元素的早期出现次数,您可以避免担心列表的长度一直在变化。
此方法还保留元素在原始数组中出现的顺序。请注意,该指令仅删除重复项(a.k.a.后续事件)。
例如,[9,3,4,3,5]
列表应缩减为[9,3,4, 5]
,因为第二次出现的3
被视为重复,应删除。
答案 1 :(得分:0)
这种方法怎么样:
3
另一种方法是在对列表进行排序后,找到要为每个数字删除的子列表的长度:
>>> set(arr)
set([1, 2, 3, 4, 5, 6, 7, 8, 9]) #Just to compare it with the results below.
>>> arr = [1,3,4,5,2,3,4,2,5,7,3,8,1,9,6,2,1,2,1,3,4,3,4,6,9]
>>> arr.sort()
>>> arr
[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9]
>>> for i in arr:
while arr.count(i) > 1:
del arr[i]
>>> arr
[1, 2, 3, 4, 5, 6, 7, 8, 9]