in_lines = ['this is go:od',
'that example is bad',
'amp is a word']
def remove_words(in_list, bad_list):
out_list = []
for line in in_list:
words = ' '.join([word for word in line.split() if not any([phrase in word for phrase in bad_list]) ])
out_list.append(words)
return out_list
out_lines = remove_words(in_lines, ['amp', ':'])
print (out_lines)
Как ни странно, утверждение
word for word in line.split() if not any([phrase in word for phrase in bad_list])
выполняет всю тяжелую работу здесь одновременно.Он создает список значений True
/ False
для каждой фразы в «плохом» списке, примененной к одному слову.Функция any
снова конденсирует этот временный список в одно значение True
/ False
, и если это False
, то слово можно безопасно скопировать в список вывода на основе строки.
Например, результат удаления всех слов, содержащих a
, выглядит следующим образом:
remove_words(in_lines, ['a'])
>>> ['this is go:od', 'is', 'is word']
(также можно удалить строку for line in ..
. В этот момент читаемость действительно начинает страдать, хотя.)