6

英単語を含む大きなリスト (1,000,000 項目以上) があります。

tokens = ["today", "good", "computer", "people", "good", ... ]

リスト内で一度だけ出現するすべてのアイテムを取得したい

今私は使用しています:

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

しかし、それは本当に遅いです。どうすればこれをより速くすることができますか?

4

1 に答える 1

18

リストを繰り返し処理し、要素ごとに繰り返し実行すると、O(N²) になります。countyourを aに置き換えるCounterと、リストを 1 回反復し、次に一意の要素のリストをもう一度反復するため、最悪の場合は 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']
于 2012-05-06T07:45:53.257 に答える