Лучший способ отладить это - проверить, что ваши предположения о состоянии программы выполняются на каждом шаге.Не забегайте вперед, пока не убедитесь, что каждая строка кода выполняет то, что вы ожидаете.Добавление печати в ваш цикл показывает, что именно i
находится на каждой итерации:
Mr.
Stark...
I
don't
feel
so
good
Ни одно из этих слов не содержится в a = ['#',',','!','.','?','$']
, поэтому условный блок внутри вашего цикла никогда не запускается.После того, как цикл исчерпан, ваша программа возвращает None
, которые возвращаются функциями Python, если не указано возвращаемое значение.
Более того, ваши операции условного блока не работают так, как вы ожидаете;проверяйте возвращаемые значения и избегайте назначения, если они являются операцией на месте, такой как .append()
, которая возвращает None
и не должна назначаться чему-либо.Кроме того, если блок if
выполняется, он преждевременно return
приведет к результату, не завершив работу с остальной частью списка.
Возможно, вы ищете что-то вроде этого:
def sentence_to_words(s):
s_new = []
ignore = ["#", "!", ",", ".", "?", "$"]
for word in s.split():
cleaned_word = ""
for letter in list(word):
if letter not in ignore:
cleaned_word += letter
s_new.append(cleaned_word.lower())
return s_new
print sentence_to_words("Mr. Stark... I don't feel so good")
Вывод:
['mr', 'stark', 'i', "don't", 'feel', 'so', 'good']
Подход в приведенном выше примере состоит в том, чтобы перебирать слова, затем перебиратьбуквы в каждом слове, чтобы очистить их в соответствии с требованиями и добавить чистое слово в массив результатов.Обратите внимание на описательные имена переменных, которые помогают понять программу (например, i
фактически было словом в вашем коде, но i
обычно означает целое число или индекс).
Приведенный выше пример можно оптимизировать--it использует много подверженных ошибкам массивов и циклов, список игнорирования должен быть параметром, чтобы сделать функцию многократно используемой, а оператор in
работает медленно в списках (ignore
должен быть набором).Использование regex делает его однострочным:
import re
def sentence_to_words(s):
return re.sub(r"[\#\,\!\.\?\$]", "", s).lower().split()
Или использование filter
и список символов, которые следует игнорировать в качестве параметра по умолчанию:
def sentence_to_words(s, ignore=set("#!,.?$")):
return filter(lambda x: x not in ignore, s).lower().split()
Попробуйте!