Как читать слова из sys.stdin и фильтровать те, которые заканчиваются на «iary»

#python

#python

Вопрос:

Моя нынешняя попытка заключается в следующем:

 iary_word = [word for word in sys.stdin if word.endswith("iary")
print(len(iary_word))
 

но он всегда выводит 0.

Что не так с моим кодом и как я могу заставить его работать?

Комментарии:

1. Вы должны уточнить, что именно не так с вашим текущим кодом. Если вы получаете сообщение об ошибке, всегда включайте полную обратную трассировку ошибок. Если вы не получаете ожидаемый результат, включите хорошо подобранный образец ввода и соответствующий результат по сравнению с ожидаемым результатом.

2. он просто выводит 0 вместо ожидаемого значения, которое в данном случае равно 14

Ответ №1:

При повторении sys.stdin , как и при повторении объекта текстового файла, Python выполняет итерацию построчно.

Итак, вы получаете строку, а не одно слово, на каждой итерации вашего цикла for . Вы должны разделить эту строку, чтобы получить отдельные слова:

 iary_words = []
for line in sys.stdin:
    for word in line.split():
        if word.endswith('iary'):
            iary_words.append(word)
 

Или с пониманием списка, вложением циклов в том же порядке:

 iary_words = [word for line in sys.stdin for word in line.split() if word.endswith('iary')]
 

Ответ №2:

Из того, что я вижу, когда вы принимаете входные данные sys.stdin , вы не удаляете символ новой строки. Символ новой строки ( n ) добавляется в конец каждого ввода из sys.stdin . Это испортит список, так как взятые слова заканчиваются на "iaryn" «а не просто "iary" » .

Поэтому, прежде чем вы что-либо сделаете, вы можете захотеть сделать .rstrip() перед проверкой в итерации, что-то вроде этого:

 iary_words = []

for line in sys.stdin:

   sentence = line.rstrip('n') 
   # this turns something like "biaryn" to "biary"

   if sentence.endswith("iary"):

      iary_words.append(sentence)

return len(iary_words)
 

Это работает, но это не блестящее определение красоты. Может быть, вы можете перечислить понимание этого, но это было просто проще.