有没有办法在保持原始订单的同时删除列表中的重复项?

时间:2017-01-13 00:17:16

标签: python list while-loop duplicates

有没有办法保留列表中元素的原始顺序? 我的代码如下,我将其作为输出

值:[1, 3, 0, 1, 4, 1, 1, 2, 2, 5, 4, 3, 1, 3, 3, 4, 2, 4, 3, 1, 3, 0, 3, 0, 0]

清洁:[5, 2, 4, 1, 3, 0]

我需要[1, 2, 0, 4, 5, 3]作为“清洁”列表

def remove_duplicates(lst)
 i = len(lst)
 while i>0:
  while values.count(values[i]>1:
   values.remove(values[i])
   i-=1
  i-=1
 return

使用for循环和新的列表输出解决这个问题似乎很简单,但是我需要使用while循环并且只使用一个列表。

def remove_duplicates(lst):
 new =[]
 for x in lst:
  if x not in lst:
   new.append(x)
 return new

1 个答案:

答案 0 :(得分:1)

def remove_duplicates(lst):
    i = 0
    while i < len(lst):
        j = i + 1
        while j < len(lst):  # check for duplicates of lst[i] and remove them
            if lst[i] == lst[j]:
                del lst[j]
            else:
                j += 1  # only increment second idx if the item is not removed!
        i += 1
    return

测试它:

>>> lst = [1, 3, 0, 1, 4, 1, 1, 2, 2, 5, 4, 3, 1, 3, 3, 4, 2, 4, 3, 1, 3, 0, 3, 0, 0]
>>> remove_duplicates(lst)
>>> lst
[1, 3, 0, 4, 2, 5]

您也可以使用set而不是第二个while循环来实现它(这肯定会更快,但我不确定是否允许!):

def remove_duplicates(lst):
    i = 0
    found = set()
    while i < len(lst):
        if lst[i] in found:
            del lst[i]
        else:
            found.add(lst[i])
            i += 1
    return

list.remove的文档中可以找到关于你的方法无法工作的快速说明:

  

list.remove(x)的

     

从列表中删除值为x的第一项。如果没有这样的项目,则会出错。

但你要删除除第一个以外的所有事件!