Python 筛选在非常大的列表中只出现一次的项

Python 筛选在非常大的列表中只出现一次的项,python,performance,algorithm,list,filter,Python,Performance,Algorithm,List,Filter,我有一个很大的列表(超过1000000项),其中包含英语单词: tokens = ["today", "good", "computer", "people", "good", ... ] 我想获取列表中只出现一次的所有项目 现在我正在使用: tokens_once = set(word for word in set(tokens) if tokens.count(word) == 1) 但是它真的很慢。我怎样才能使它更快呢?您迭代了一个列表,然后对每个元素重复一次,这使它成为O(N²)。

我有一个很大的列表(超过1000000项),其中包含英语单词:

tokens = ["today", "good", "computer", "people", "good", ... ]
我想获取列表中只出现一次的所有项目

现在我正在使用:

tokens_once = set(word for word in set(tokens) if tokens.count(word) == 1)

但是它真的很慢。我怎样才能使它更快呢?

您迭代了一个列表,然后对每个元素重复一次,这使它成为O(N²)。如果用
计数器
替换
计数
,则在列表上迭代一次,然后在唯一元素列表上迭代一次,在最坏的情况下,这将使其成为O(2N),即O(N)


在Python 3中,
iteritems
已重命名为
items
from collections import Counter

tokens = ["today", "good", "computer", "people", "good"]
single_tokens = [k for k, v in Counter(tokens).iteritems() if v == 1 ]
# single_tokens == ['today', 'computer', 'people']