2012-05-06 14 views
6

मैं एक बड़ी सूची (1,000,000 से अधिक आइटम) है में एक बार होता है, जो अंग्रेज़ी शब्द हैं:फ़िल्टर आइटम है कि केवल एक बहुत बड़ी सूची

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

मैं सभी आइटम प्राप्त करना चाहते हैं कि केवल एक बार होता है सूची

अब

में मैं उपयोग कर रहा हूँ:

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

लेकिन यह वास्तव में धीमी है। मैं इसे तेजी से कैसे बना सकता हूं?

उत्तर

18

आप एक सूची में फिर से शुरू होते हैं और फिर प्रत्येक तत्व के लिए आप इसे फिर से करते हैं, जो इसे ओ (एन²) बनाता है। यदि आप Counter द्वारा अपने count को प्रतिस्थापित करते हैं, तो आप सूची में एक बार फिर से सक्रिय होते हैं और फिर एक बार फिर अद्वितीय तत्वों की सूची में, जो इसे सबसे खराब स्थिति में बना देता है, ओ (2 एन), यानी ओ (एन)।

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

अजगर 3 में, '' iteritems' items' को नाम दिया गया है –

संबंधित मुद्दे