Как убрать отметки со строки и превратить ее в список - PullRequest
0 голосов
/ 21 ноября 2018

Мне нужно создать функцию, которая превращает строку в список без !?., %#$ . и без заглавных букв.Строка в конце - просто пример, поэтому она должна вернуть ['mr', 'stark', 'i', "don't", 'feel', 'so', 'good']

Может кто-нибудь сказать мне, почему мой код печатает None?

def sentence_to_words(s):
    # Write the rest of the code for question 2 below here.
    s_new= []
    s1 = s.split()
    a = ['#',',','!','.','?','$']
    for i in s.split():
        if i in a:
            s2 = s1.remove(i)
            s_new = s_new.append(s2)
            return s_new
print sentence_to_words("Mr. Stark... I don't feel so good")

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я не очень хорошо понял ваш код, но где есть альтернатива, использующая re.sub и split().Сначала мы удаляем любые специальные символы с помощью re.sub и затем используем split, чтобы получить список слов, например:

import re
sentence = "Mr. Stark... I don't feel so good"
words = re.sub(r"[#,!\?\$.]", "", s).split()

Используя re.split:

words = re.split("[^a-z'-]+", sentence, 0, re.IGNORECASE)

Вывод обоих примеров:

# ['Mr', 'Stark', 'I', 'don't', 'feel', 'so', 'good']   

Ideone Demo

0 голосов
/ 21 ноября 2018

Лучший способ отладить это - проверить, что ваши предположения о состоянии программы выполняются на каждом шаге.Не забегайте вперед, пока не убедитесь, что каждая строка кода выполняет то, что вы ожидаете.Добавление печати в ваш цикл показывает, что именно 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()

Попробуйте!

...