2013-10-04 4 views
-1

я пытаюсь удалить ненужные слова (ап, а, в) из спискаудаление слов из списка, используя список понимание

Test = ['a', 'an', 'the', 'love'] 
unWantedWords = ['a', 'an', 'the'] 
RD1 = [x for x in Test if x != unWantedWords] 
print(RD1) 
output ->['a', 'an', 'the', 'love'] 

что не так ж/это?

+0

это питон 3.x? – Vivek

+0

У меня есть python 2.7 – JPP

+1

Еще один намек: не используйте капитализированные переменные ... они используются для классов (см. PEP8 - Руководство по стилю для кода Python: http://www.python.org/dev/peps/pep-0008/) – Don

ответ

4

Проблема в том, что вы сравниваете значение x со всем списком unWantedWords.

RD1 = [x for x in Test if x != unWantedWords] 

Замените! = С не в, чтобы проверить, нет ли x ... нет!

RD1 = [x for x in Test if x not in unWantedWords] 
+1

Разве это понимание списка не имеет квадратичной сложности? Я подозреваю, что было бы лучше конвертировать 'unWantedWords' в первый набор, чтобы' in' test был 'O (1)'. –

+0

Вполне возможно. Единственная проблема может заключаться в том, что слова в списке не гарантируются как уникальные. – dejester

+0

слова в списке не уникальны – JPP

3
RD1 = [x for x in Test if x not in unWantedWords] 

unWantedWords - это массив, и вы компилируете свои слова массивом, поэтому он не работает.

1

Это неправильно.

RD1 = [x for x in Test if x != unWantedWords] 

ваше состояние если х! = UnWantedWords проверяет, если х равен списку unWantedWords, вместо того, чтобы проверить, если х существует или нет в unWantedWords.

Условие всегда истинно, потому что x - это строка, а не список. Поэтому все ваши слова добавляются в список.

Правильная идиома будет если x не в unWantedWords.

Вы можете сделать, RD1 = [x for x in Test if x not in set(unWantedWords)]

2

Если вы не возражаете:

  1. удаление дубликатов
  2. сохраняющие первоначальный заказ

вы можете просто использовать 'набор' (здесь является основным алгоритмом):

>>> Test = ['a', 'an', 'the', 'love'] 
>>> unWantedWords = ['a', 'an', 'the'] 
>>> print set(Test) - set(unWantedWords) 
set(['love']) 

>>> print list(set(Test) - set(unWantedWords)) 
['love'] 

У этого есть преимущество в оптимизации сложности.

Конечно, вы можете обернуть этот код, чтобы сохранить дубликаты и порядок ...

+0

Итак, вы использовали концепцию разности понятий ?? Я думаю, что тоже эффективный –

+0

@GrijeshChauhan: Да, операции с набором часто являются лучшими для таких целей. – Don

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