2012-05-11 2 views
1

У меня есть список проклятых слов, которые я хочу сопоставить с другим списком, чтобы удалить совпадения. Обычно я использую list.remove («запись») на индивидуальной основе, но перебираю список записей по другому списку, а затем удаляет их. Есть идеи?Удалить список записей, которые соответствуют любой записи в другом списке

+3

Вы пишете профанация фильтр? Удачи вам с проблемой [Scunthorpe] (http://en.wikipedia.org/wiki/Scunthorpe_problem)! – Johnsyweb

+0

Имеет ли значение вопрос? (если да, возьмите фильтр, если нет, возьмите наборы) – georg

ответ

10

Использование filter:

>>> words = ['there', 'was', 'a', 'ffff', 'time', 'ssss'] 
>>> curses = set(['ffff', 'ssss']) 
>>> filter(lambda x: x not in curses, words) 
['there', 'was', 'a', 'time'] 
>>> 

Это также может быть сделано с пониманием списка:

>>> [x for x in words if x not in curses] 
+2

Создание 'curses' списка - плохая идея -' in' является O (1) для набора, O (n) для списка. –

+0

Спасибо Хью, исправлена. –

4

Использование комплектов.

a=set(["cat","dog","budgie"]) 
b=set(["horse","budgie","donkey"]) 
a-b 
->set(['dog', 'cat']) 
+0

Что делать, если у меня уже есть списки? Могу ли я сделать: а = [ 'bad_word1', 'bad_word2'] б = [ 'а', 'б', 'bad_word1'] set1 = множество (а) set2 = множество (б) set1 - set2 a = set1 b = set2 – ewhitt

+0

Обратите внимание, что наборы могут испортить порядок слов, а также удалять повторяющиеся слова из вашего списка. И это должно быть быстрее, я думаю. –

Смежные вопросы