2016-02-25 1 views
4

У меня есть список под названием words, содержащий слова, которые могут быть в верхнем или нижнем регистре, или их комбинация. Затем у меня есть еще один список: stopwords, который содержит только строчные слова. Теперь я хочу пройти каждое слово в stopwords и удалить все экземпляры этого слова из words в нечувствительном к регистру образом, но я не знаю, как это сделать. Предложения?Как удалить слова из списка без учета регистра?

Пример:

words = ['This', 'is', 'a', 'test', 'string'] 
stopwords = ['this', 'test'] 

for stopword in stopwords: 
    if stopword in words: 
     words.remove(stopword); 

print words 

Результат показан следующим образом: ['This', 'is', 'a', 'string']

Правильное возвращение должно быть так: ['is', 'a', 'string']

ответ

9

Сделайте слово в нижнем регистре, так что вам не нужно беспокоиться о обсадной колонны:

words = ['This', 'is', 'a', 'test', 'string'] 
stopwords = {'this', 'test'} 

print([i for i in words if i.lower() not in stopwords]) 

Outpu TS:

['is', 'a', 'string'] 

В качестве дополнительной записке, на @ cricket_007 (и благодаря @chepner для коррекции) комментария, делая стоп-слов набор сделает его более производительным. Обратите внимание на изменение в секундах выше, что делает его набором вместо списка.

+0

Будет работать лучше, если бы временные слова были 'set' –

+0

@ cricket_007 Это хороший момент. Обновлено. Благодарю. – idjaw

+3

Вы сделали 'stopwords' кортеж, а не набор. '{'this', 'test'}' в Python 2.7+, 'set (['this', 'test'])' в противном случае. – chepner

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