2012-05-06 13 views
6

私は英語の単語が含まれています(1,000,000項目以上)大規模なリストを持っていますフィルター項目

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

をそれは本当に遅いです:リスト

に今私が使用しています。これをもっと速くするにはどうすればいいですか?

答えて

18

あなたはリストを反復処理し、次に各要素に対して再度O(N²)を行います。 countCounterに置き換えた場合は、リスト上で一度反復してから、ユニークな要素のリストをもう一度繰り返します。最悪の場合、O(2N)、つまりO(N)になります。

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'] 
+1

Python 3では、 'iteritems'の名前が' items'に変更されました。 –