我尝试搜索并找不到这种确切的情况,所以如果它已经存在就道歉。
我正在尝试从列表中删除重复项以及我正在搜索的原始项目。如果我有这个:
ls = [1, 2, 3, 3]
我想最终得到这个:
ls = [1, 2]
我知道使用set会删除像这样的重复项:
print set(ls) # set([1, 2, 3])
但它仍然保留了我想删除的3
元素。我想知道是否有办法删除重复项和原始匹配项。
答案 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]