Python:在列表中删除重复项(不保留它们)

4

假设我有以下代码:

x=[a,b,a,b,c,d]

我希望找到一种获取

y=[c,d]

我已经成功使用计数器完成了它:

 for i in x:
   if x.count(i) == 1:
     unique.append(i)

问题在于,对于更大的列表,这种方法速度非常慢,有没有帮助的方法?

你想保留字符的顺序吗? - Alex Riley
不需要,谢谢。 - TNF
3
创建一个 collections.Counter 字典,然后再遍历一次列表,移除计数大于 1 的项。 - Ashwini Chaudhary
pandas 的方法是 import pandas as pd x=['a','b','a','b','c','d'] s = pd.Series(x) s[s.isin(s.unique()[(s.value_counts()==1).values])] 但在构建系列时,从列表中创建系列会有成本。 - EdChum
1
@Reticality,你提供的那个复制链接并不是这个问题的最佳答案。 - EdChum
3个回答

4

首先使用字典进行计数:

d = {}
for i in x:
    if i not in d:
        d[i] = 0
    d[i] += 1
y = [i for i, j in d.iteritems() if j == 1]

3
x=["a","b","a","b","c","d"]

from collections import Counter

print([k for k,v in Counter(x).items() if v == 1])    
['c', 'd']

或者为了保证顺序,先创建计数器字典,然后遍历x列表进行值的查找,只保留值为1的k:

x = ["a","b","a","b","c","d"]
from collections import Counter

cn = Counter(x)
print([k for k in x if cn[k] == 1])

需要在x上进行一次遍历来创建字典,在推导式中再进行一次遍历,这样可以得到一个总体复杂度为0(n)的解决方案,而不是使用计数方法的平方级别复杂度。

Counter字典用于统计每个元素出现的次数:

In [1]: x = ["a","b","a","b","c","d"]    
In [2]: from collections import Counter    
In [3]: cn = Counter(x)    
In [4]: cn
Out[4]: Counter({'b': 2, 'a': 2, 'c': 1, 'd': 1})
In [5]: cn["a"]
Out[5]: 2  
In [6]: cn["b"]
Out[6]: 2    
In [7]: cn["c"]
Out[7]: 1

执行cn[k]返回每个元素的计数,因此我们最终只保留c和d。


-2

最好的方法是使用set()函数,像这样:

x=['a','b','a','b','c','d']
print list(set(x))

由于set()函数返回的结果是无序的。可以使用sorted()函数来解决这个问题:

x=['a','b','a','b','c','d']
print list(sorted(set(x)))

这不满足OP的要求,即过滤具有计数> 1的元素。 - EdChum

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