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

5

我尝试搜索,但找不到完全符合的情况,如果已经存在,请见谅。

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

ls = [1, 2, 3, 3]

我希望最终得到这个结果:

ls = [1, 2]

我知道使用set可以去除重复项,就像这样:

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

但它仍保留了我想要删除的3元素。我想知道是否有一种方法可以同时删除重复项和匹配项。

2个回答

14

使用列表推导和 list.count

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

这是关于这两个问题的一个参考文献

编辑:

@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的参考资料。

谢谢,太棒了!我需要更多地使用列表推导式。 - user2246579
6
这是O(N^2)的算法,适用于小型列表,但对于较大的列表将会很慢。你可以通过先计算出现次数来解决这个问题:c = collections.Counter(ls); uniqs = [x for x in ls if c[x] == 1] - Paul Hankin

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接