我尝试搜索,但找不到完全符合的情况,如果已经存在,请见谅。
我正在尝试从列表中删除重复项以及我正在搜索的原始项目。 如果我有这个:
ls = [1, 2, 3, 3]
我希望最终得到这个结果:
ls = [1, 2]
我知道使用set可以去除重复项,就像这样:
print set(ls) # set([1, 2, 3])
但它仍保留了我想要删除的3
元素。我想知道是否有一种方法可以同时删除重复项和匹配项。
我尝试搜索,但找不到完全符合的情况,如果已经存在,请见谅。
我正在尝试从列表中删除重复项以及我正在搜索的原始项目。 如果我有这个:
ls = [1, 2, 3, 3]
我希望最终得到这个结果:
ls = [1, 2]
我知道使用set可以去除重复项,就像这样:
print set(ls) # set([1, 2, 3])
但它仍保留了我想要删除的3
元素。我想知道是否有一种方法可以同时删除重复项和匹配项。
使用列表推导和 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
的参考资料。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]
c = collections.Counter(ls); uniqs = [x for x in ls if c[x] == 1]
。 - Paul Hankin