Python - строковый индекс вне диапазона - PullRequest
0 голосов
/ 12 сентября 2018

Это вопрос, который мне дали решить:

Создание программы вводит фразу (например, известную цитату) и печатает все слова, начинающиеся с hz.

Я решил проблему, но первые два метода не сработали, и я хотел знать, почему:

# 1 строковый индекс вне диапазона

quote = input("enter a 1 sentence quote, non-alpha separate words: ")
word = ""

for character in quote:
    if character.isalpha():
        word += character.upper()
    else:
        if word[0].lower() >= "h":
            print(word)
            word = ""
        else: 
            word = ""

Я получаю сообщение IndexError: string index out of range для любых слов после "g".Не должен ли оператор else его уловить?Я не понимаю, почему это не так, потому что, если я уберу скобки [] с word[0], это сработает.

# 2: последнее слово не печатается

quote = input("enter a 1 sentence quote, non-alpha separate words: ")
word = ""

for character in quote:
    if character.isalpha():
        word += character.upper()
    else:
        if word.lower() >= "h":
            print(word)
            word = ""
        else: 
            word = ""

В этом примере это работает до определенной степени.Он удаляет все слова перед «h» и печатает слова после «h», но по какой-то причине не печатает последнее слово.Неважно, какую цитату я использую, последнее слово не печатается, даже если оно после 'h'.Почему это так?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вместо того, что вы делаете, вы можете перебирать каждое слово в строке и подсчитывать, сколько из них начинается с этих букв.Прочитайте о функции str.split (), в параметре, который вы вводите разделитель, в данном случае '', так как вы хотите посчитать слова, и это возвращает список строк.Итерируйте это в цикле, и оно должно работать.

0 голосов
/ 12 сентября 2018

Вы звоните на word[0].Доступ к первому элементу итерируемой строки word.Если word пусто (то есть word == ""), «первый элемент» не доступен;таким образом вы получаете IndexError.Если «слово» начинается с неалфавитного символа (например, цифры или тире), то это произойдет.

Вторая ошибка, с которой у вас есть второй фрагмент кода, пропускающий последнее слово, из-за подхода, который вы используете для этой проблемы.Похоже, что вы пытаетесь пройти по предложенному вами предложению, символ за символом, и решить, печатать ли слово после прочтения его (которое вы знаете, потому что нажали пробел.Но это приводит к проблеме с вашим вторым подходом, который заключается в том, что он не печатает последнюю строку. Это потому, что последний символ в вашем предложении не является пробелом - это просто последняя буква в последнем слове. Итак, вашЦикл else никогда не выполняется.

Я бы рекомендовал использовать совершенно другой подход, используя метод string.split(). Этот метод встроен в python и преобразует одну строку в список строк меньшего размера.разделите пополам указанный вами символ / подстроку. Поэтому, если я сделаю

quote = "Hello this is a sentence"
words = quote.split(' ')
print(words)

, вы увидите следующее:

['Hello', 'this', 'is', 'a', 'sentence']

Несколько вещей, которые нужно сохранитьпомните о вашем следующем подходе к этой проблеме:

  1. Вам необходимо учитывать пустые слова (например, если у меня есть два пробела подряд по какой-то причине), и убедиться, что они неt сломать скрипт.
  2. Вам необходимо учитывать не алфавитно-цифровые символы, такие как цифры и тире.Вы можете либо игнорировать их, либо обращаться с ними по-другому, но у вас должно быть что-то на месте.
  3. Вам нужно убедиться, что вы обрабатываете последнее слово в какой-то момент, даже если предложение не заканчивается напробел.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...