2012-05-06 13 views
6

Tengo una lista grande (más de 1.000.000 de artículos), que contiene palabras en inglés:elementos de filtro que sólo ocurre una vez en una lista muy grande

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

Me gustaría obtener todos los elementos que se produce sólo una vez en la lista

ahora estoy usando:

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

pero es muy lento. ¿Cómo podría hacer esto más rápido?

Respuesta

18

Usted itera sobre una lista y luego para cada elemento lo hace de nuevo, lo que lo hace O (N²). Si reemplaza su count por un Counter, itera una vez sobre la lista y luego una vez más sobre la lista de elementos únicos, lo que hace que, en el peor de los casos, O (2N), es decir, 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

en Python 3, 'iteritems' ha sido renombrado a' items' –

Cuestiones relacionadas