通过编辑列表从列表中删除重复的条目

时间:2016-01-02 12:31:21

标签: python list duplicates

列出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

有人可以帮我解决这个问题吗? 在此先感谢。

2 个答案:

答案 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]