从列表中删除重复项,包括原始匹配项

时间:2014-01-03 16:33:37

标签: python list duplicates duplicate-removal

我尝试搜索并找不到这种确切的情况,所以如果它已经存在就道歉。

我正在尝试从列表中删除重复项以及我正在搜索的原始项目。如果我有这个:

ls = [1, 2, 3, 3]

我想最终得到这个:

ls = [1, 2]

我知道使用set会删除像这样的重复项:

print set(ls)  # set([1, 2, 3])

但它仍然保留了我想删除的3元素。我想知道是否有办法删除重复项和原始匹配项。

2 个答案:

答案 0 :(得分:13)

使用列表推导和list.count

>>> ls = [1, 2, 3, 3]
>>> [x for x in ls if ls.count(x) == 1]
[1, 2]
>>>

这两个都是reference


修改

@Anonymous在下面提出了一个很好的观点。上述解决方案适用于小型列表,但对于较大的列表可能会变慢。

对于大型列表,您可以改为:

>>> from collections import Counter
>>> ls = [1, 2, 3, 3]
>>> c = Counter(ls)
>>> [x for x in ls if c[x] == 1]
[1, 2]
>>>

以下是collections.Counter的参考资料。

答案 1 :(得分:0)

如果项目是连续的,那么您可以使用groupby来保存在内存中构建辅助数据结构......:

from itertools import groupby, islice

data = [1, 2, 3, 3]
# could also use `sorted(data)` if need be...
new = [k for k, g in groupby(data) if len(list(islice(g, 2))) == 1]
# [1, 2]