2010-08-18 2 views
9

Извините, если вопрос немного запутан. Это похоже на this questionКак удалить список слов из списка строк

Я думаю, что вышеупомянутый вопрос близок к тому, что я хочу, но в Clojure.

Существует another вопрос

мне нужно что-то вроде этого, но вместо '[ш] в этом вопросе, есть список строк, которые должны быть найдены и удалены.

Надеюсь, я поняла.

Я думаю, что это связано с тем, что строки в python неизменяемы.

У меня есть список шумовых слов, которые нужно удалить из списка строк.

Если я использую понимание списка, я в конечном итоге снова и снова повторяю одну и ту же строку. Таким образом, удаляется только «из», а не «the». Поэтому мой измененный список выглядит так:

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)] 

Я хотел бы знать, что я делаю.

+1

Что такое 'place'? – katrielalex

+0

Вы не проясняете; сформулируйте свой вопрос * здесь *, а затем поместите ссылки на похожие вопросы с похожими ответами, если вы считаете, что это необходимо ниже. –

ответ

9

Вот мой удар по нему. Это использует регулярные выражения.

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] 

Update

Исправлена ​​ошибка указал 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: выше изменения избегает обрезки задних "в "от" Испания ". Чтобы проверить запуск обеих версий регулярных выражений по фразе «Испания имеет дождь».

+0

Спасибо. Он работает таким образом. Теперь я смог понять концепцию лямбда более четко, поскольку у меня появилась возможность реализовать это. – prabhu

+1

Это не работает должным образом для фразы «Испания имеет дождь». Это легко исправить, хотя –

+0

@Gnibbler: спасибо, что указали это. Я меняю свой ответ соответственно. –

3
>>> 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'] 
+0

Ничего себе! Это настоящий классный способ сделать, хотя я напряг свой мозг. :-) – prabhu

+0

Это не похоже на каждый экземпляр слов. Например, «Нью-Йорк» становится «Нью-Йорком». – Namey

+1

@Namey, вы можете использовать что-то вроде '' \\ W? \\ b (% s) \\ W? ''. Без OP, обеспечивающего полный набор тестовых ящиков, это немного бит-моль –

1

Поскольку вы хотели бы знать, что вы делаете неправильно, эта линия:

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.

+0

Спасибо. Это было очень полезно. – prabhu

14

Без регулярных выражений вы могли бы сделать так:

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 
+0

Отлично! Спасибо! – prabhu

+0

Я наткнулся на это и понятия не имел, что происходит здесь. Если кто-то споткнется об этом и задается вопросом, что такое магия, это называется понятием списка, и это хорошая статья, объясняющая это. Http://carlgroner.me/Python/2011/11/09/An-Introduction-to-List-Comprehensions- в-Python.html –