2017-03-10 55 views
0

我需要从列表中删除重复项,但返回相同的列表。 所以选项,如:删除列表中的重复项,但返回相同的列表

return list(set(list)) 

不会为我的工作,因为它创造了一个新的列表来代替。

def remove_extras(lst): 
    for i in lst: 
    if lst.count(i)>1: 
     lst.remove(i) 
    return lst 

这里是我的代码,它适用于某些情况下,但我不知道为什么它不工作remove_extras([1,1,1,1]),因为它返回[1,1]时1的计数应该> 1。

+5

首先,你永远不应该(直到绝对必要)修改你迭代在一个循环的对象。 –

回答

2

在创建新列表之后,可以使用切片分配来替换列表的内容。在结果的情况下,为了不要紧,你可以使用set

def remove_duplicates(l): 
    l[:] = set(l) 

l = [1, 2, 1, 3, 2, 1] 
remove_duplicates(l) 
print(l) 

输出:

[1, 2, 3] 
+2

啊,打我吧。仅供参考,不需要'list'包装:'l [:] = set(l)'将工作得很好(在内部,我认为它是正确的,但它比明确的转换更便宜)。 – ShadowRanger

+0

@ShadowRanger感谢您的评论,更新了答案。我认为片分配需要一个列表,但任何迭代似乎工作。 – niemmi

+0

这适用于我,谢谢! – Silver

0

你可以做到这一点使用OrderedDict,同时保持列表的顺序从而消除了重复。

>>> from collections import OrderedDict 
>>> itemList = [1, 2, 0, 1, 3, 2] 
>>> itemList[:]=OrderedDict.fromkeys(itemList) 
>>> itemList 
[1, 2, 0, 3] 

这有一个运行时:O(N)

+0

没有将切片分配回'itemList',这实际上并不回答问题。你想'itemList [:] = OrderedDict.fromkeys(itemList)'。 – ShadowRanger

+0

@ShadowRanger,当然。我刚才展示了它的工作原理。归还它毕竟是一件容易的事。 –

+0

这是OP的唯一真正的问题;展示一种更好的独立化方法是很好的,但是你需要回答这个问题(如何去除原来的''list'')。 – ShadowRanger