Я начинающий программист, и на практике я хочу создать код, который бы печатал каждое слово в предложении в новую строку, учитывая, что слово начинается с h-z.

Вот код, который я сделал:

random_phrase = "Wheresoever you go, go with all your heart"
word = ""
for ltr in random_phrase:
    if ltr.isalpha():
        word += ltr
    else:
        if word.lower()[0] > "g":
            print(word)
            word = ""
        else:
            word = ""

После того, как он напечатает вас, появляется строка пустого пространства, затем возникает ошибка индекса. Что я сделал не так?

1
Jill and Jill 3 Май 2019 в 07:01

5 ответов

Лучший ответ
  • В исходном коде у вас есть ,, который вызывает разрыв вашего кода, поскольку он не является буквенно-цифровым символом, поэтому он входит в цикл else, где ваш word является пустой строкой, и когда вы пытаетесь получить первый элемент пустой строки, вы получаете IndexError. Следовательно, лучше проверить наличие непробельного символа, такого как if ltr != ' ':.

  • Вы можете сбросить word = "" вне условия if

  • Ваш код не проверяет последнее слово в строке, что вы можете сделать после завершения цикла for

Таким образом, ваш рефакторинг кода будет выглядеть

random_phrase = "Wheresoever you go go with all your heart"
word = ""
for ltr in random_phrase:
    #Check for non-whitespace character
    if ltr != ' ':
        word += ltr
    else:
        #Check if word starts with g
        if word.lower()[0] > "g":
            print(word)
        #Reset word variable
        word = ""

#Check the last word
if word.lower()[0] > "g":
    print(word)

На выходе будет

Wheresoever
you
with
your
heart

Вы можете значительно упростить свой код, разбив строку на слова, используя string.split, просматривая слова и проверяя, находится ли первый символ каждого слова в h-z

random_phrase = "Wheresoever you go, go with all your heart"

#Split string into words
words = random_phrase.split()

#Iterate through every word
for word in words:

    #If the first character of the word lies between h-z, print it
    if word.lower()[0] > "g":
        print(word)

Здесь ваш вывод будет

Wheresoever
you
with
your
heart
1
Devesh Kumar Singh 3 Май 2019 в 04:54

Что я сделал не так?

Когда ваш процесс встречает запятую (не-альфа) после слова go, он определяет, что go не начинается с буквы, большей чем 'g', поэтому он присваивает пустую строку {{X3} }} (else; word = ''). Следующий элемент - это пробел, который не является альфа, и он пытается сравнить первую букву word, которая является пустой строкой (''[0] > 'g'), поэтому он вызывает ошибку IndexError.

Вы можете исправить это, проверив, является ли word пустой строкой перед сравнением.
+ Изменить

if word.lower()[0] > "g":

К

if word and word.lower()[0] > "g":

Пустая строка оценивается как логическое значение False:

>>> s = ''
>>> bool(s)
False
>>>

and - логическая операция; x and y оценивается как False, если какой-либо из членов имеет значение False - x вычисляется первым; если это False, его значение будет возвращено и y не будет оцениваться. Это называется короткое замыкание .

>>> x = ''
>>> y = 'foo'
>>> x and y
''
>>> bool(x and y)
False
>>> if x and y:
...     print(True)
... else:
...     print(False)

False
>>> 

Мое исправление для вашего условного оператора основано на поведении короткого замыкания, поэтому word[0]... не будет оцениваться, если word - пустая строка. Ваше else предложение может быть написано немного более явно - что-то вроде:

....
    else:
        if not word:
            pass
        elif word.lower()[0] > "g":
            print(word)
        word = ""

Но по какой-то причине мне не понравилось, как это выглядело.

1
wwii 3 Май 2019 в 14:23

Попробуйте напечатать каждое слово предложения, которое начинается с h-z:

import string
# make the sentence lower case
random_phrase = "Wheresoever you go, go with all your heart".lower()
# split the sentence with space as separator into a list
words = random_phrase.split(" ")
start = "h"
end = "z"
# string.ascii_lowercase will give the lowercase letters ‘abcdefghijklmnopqrstuvwxyz’
letters = string.ascii_lowercase
# take the range h-z
allowed = letters[letters.index(start):letters.index(end)+1]
# iterate through each word and check if it starts with (h-z)
for word in words:
    if any(word.startswith(x) for x in allowed):
        print(word)

Используя регулярные выражения:

import re
random_phrase = "Wheresoever you go, go with all your heart"
words = [s for s in random_phrase.split() if re.match('^[h-z,H-Z]', s)]
for word in words:
    print(word)
0
Srivastava 3 Май 2019 в 04:37

Я думаю, что ошибка происходит из-за этого куска кода:

    if word.lower()[0] > "g":
        print(word)
        word = ""
    else:
        word = ""

Вы сбрасываете переменную word в пустое. Индексирование по пробелу не работает (как вы можете видеть, когда пытаетесь выполнить этот код):

word = ""
word[0]

IndexError: string index out of range
0
zero 3 Май 2019 в 04:10

Всегда идти на простые решения ...

phrase = "Wheresoever you go, go with all your heart"
for word in (phrase.lower()).split():
   first_letter = word[0]
   if first_letter > "g":
      print(word)
0
Gokva 3 Май 2019 в 04:59