Программа счетчика встречаемости букв, не содержащая строк, введенных пользователем

#python

#python

Вопрос:

Я создаю программу, которая подсчитывает вхождения каждой буквы в алфавите, которые находятся в строке, вводимой пользователем. Пользователю предлагается продолжать вводить строки до тех пор, пока они не будут введены <end> , что останавливает ввод и анализирует входные данные.

Анализ работает просто отлично. Проблема возникает, когда, например, я ввожу первый ввод «спасибо», а затем второй ввод «пожалуйста». Программа будет анализировать только «пожалуйста», а не «спасибо». Я не могу понять, почему.

 programrun = True        
while programrun:
  stringinput = input ("Enter a sentence or word <END> to finish: ").lower()

  if stringinput != "<end>":
    stringinput1 = stringinput

  letters =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
  #print (programrun)

  if stringinput == "<end>":
    programrun = False
  
#stringinput2 = stringinput1
  
print (stringinput1)

for i in range(0,26): 
#frequency = (int(stringinput.count(letters[i]) / 26) * 100)
  length = len(stringinput1)
  print(letters[i],": ",stringinput1.count(letters[i]), " Freqency: ", (float(stringinput1.count(letters[i]) / length) * 100))
  

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

1. Не могли бы вы правильно сделать отступ в своем коде?

2. вы должны написать последний цикл for внутри while

3. Вы перезаписываете stringinput перед его анализом. Попробуйте использовать буквы в качестве ключей в словаре, а значение — в качестве вхождения, поэтому нет необходимости объявлять весь алфавит.

Ответ №1:

Проблема в отступе, for цикл не был внутри while цикла, поэтому после ввода одного слова код останавливается, я добавляю другие улучшения

  • вы можете просто использовать строку с буквами вместо списка и определить ее перед циклом
  • выполните итерацию непосредственно по каждой букве, а не по целым числам, затем получите доступ по индексу
  • остановите код, который вводится "<end>" не выполняйте другие манипуляции со строками
 letters = 'abcdefghijklmnopqrstuvwxyz'

while True:
    stringinput = input("Enter a sentence or word <END> to finish: ").lower()

    if stringinput == "<end>":
        break

    for letter in letters:
        length = len(stringinput)
        count = stringinput.count(letter)
        print(letter, ": ", count, " Freqency: ", (count / length) * 100)
  

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

1. Извините за формат. В VSCode отступ указан правильно, но это почему-то не перешло сюда. Еще раз извините и спасибо за помощь!

Ответ №2:

Я думаю, потому что вам нужно объединить все записи в stringinput1:

 stringinput1="" 
while programrun:
    stringinput = input ("Enter a sentence or word <END> to finish: ").lower()

    if stringinput != "<end>":
        stringinput1 = stringinput1 stringinput

...