假设我有以下代码:
x=[a,b,a,b,c,d]
我希望找到一种获取
y=[c,d]
我已经成功使用计数器完成了它:
for i in x:
if x.count(i) == 1:
unique.append(i)
问题在于,对于更大的列表,这种方法速度非常慢,有没有帮助的方法?
假设我有以下代码:
x=[a,b,a,b,c,d]
我希望找到一种获取
y=[c,d]
我已经成功使用计数器完成了它:
for i in x:
if x.count(i) == 1:
unique.append(i)
首先使用字典进行计数:
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]
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。
最好的方法是使用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)))
collections.Counter
字典,然后再遍历一次列表,移除计数大于 1 的项。 - Ashwini Chaudharyimport 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