Извините, если вопрос немного запутанный. Это похоже на этот вопрос
Я думаю, что этот вопрос близок к тому, что я хочу, но в Clojure.
Есть еще один вопрос.
Мне нужно что-то подобное, но вместо «[br]» в этом вопросе есть список строк, которые необходимо найти и удалить.
Надеюсь, я ясно дал понять.
Я думаю, что это связано с тем, что строки в Python являются неизменяемыми.
У меня есть список шумовых слов, которые необходимо удалить из списка строк.
Если я использую понимание списка, Я заканчиваю поиск одной и той же строки снова и снова. Таким образом, удаляется только «из», а не «из». Итак, мой измененный список выглядит следующим образом
places = ['New York', 'the New York City', 'at Moscow' and many more]
noise_words_list = ['of', 'the', 'in', 'for', 'at']
for place in places:
stuff = [place.replace(w, "").strip() for w in noise_words_list if place.startswith(w)]
. Я хотел бы знать, какую ошибку я делаю.
Вот мой удар. Здесь используются регулярные выражения.
import re
pattern = re.compile("(of|the|in|for|at)\W", re.I)
phrases = ['of New York', 'of the New York']
map(lambda phrase: pattern.sub("", phrase), phrases) # ['New York', 'New York']
Sans lambda
:
[pattern.sub("", phrase) for phrase in phrases]
Обновление
Исправление ошибки, указанной gnibbler (спасибо!):
pattern = re.compile("\\b(of|the|in|for|at)\\W", re.I)
phrases = ['of New York', 'of the New York', 'Spain has rain']
[pattern.sub("", phrase) for phrase in phrases] # ['New York', 'New York', 'Spain has rain']
@prabhu: вышеупомянутое изменение позволяет избежать удаления в конце « в » из «Испании». Для проверки запустите обе версии регулярных выражений против фразы «В Испании идет дождь».
Без регулярного выражения вы могли бы поступить так:
places = ['of New York', 'of the New York']
noise_words_set = {'of', 'the', 'at', 'for', 'in'}
stuff = [' '.join(w for w in place.split() if w.lower() not in noise_words_set)
for place in places
]
print stuff
Поскольку вы хотите знать, что вы делаете неправильно, появляется следующая строка:
stuff = [place.replace(w, "").strip() for w in noise_words_list if place.startswith(w)]
, а затем начинается цикл по словам. Сначала он проверяет "из". Ваше место (например, "Нью-Йорка") проверяется, чтобы узнать, начинается ли оно с "из". Он преобразуется (вызов замены и удаления) и добавляется в список результатов. Главное здесь то, что результат больше никогда не исследуется. Для каждого слова, которое вы повторяете в понимании, новый результат добавляется в список результатов. Итак, следующее слово - «the», а ваше место («Нью-Йорк») не начинается с «the», поэтому новый результат не добавляется.
Я предполагаю, что в конечном итоге вы получили конкатенацию ваших переменных места. Более простой для чтения и понимания процедурный вариант будет (непроверенный):
results = []
for place in places:
for word in words:
if place.startswith(word):
place = place.replace(word, "").strip()
results.append(place)
Имейте в виду, что replace ()
удалит слово в любом месте строки, даже если оно встречается как простая подстрока. Вы можете избежать этого, используя регулярные выражения с шаблоном вроде ^ the \ b
.
>>> import re
>>> noise_words_list = ['of', 'the', 'in', 'for', 'at']
>>> phrases = ['of New York', 'of the New York']
>>> noise_re = re.compile('\\b(%s)\\W'%('|'.join(map(re.escape,noise_words_list))),re.I)
>>> [noise_re.sub('',p) for p in phrases]
['New York', 'New York']