Попытка создать программу python, но упрощенную с помощью def

Я пытаюсь создать программу, ничего не импортируя. Программа позволяет пользователю ввести отрывок, а затем выводит, сколько букв А в сообщении, сколько букв Б и т. д. Так что это работает... просто ОЧЕНЬ долго. Я новичок в кодировании, и я знаю, что есть способ упростить приведенный ниже код с помощью def, но я не совсем уверен, как это сделать. Кто-нибудь может помочь?


person jason    schedule 27.10.2016    source источник
comment
Массивы, массивы, массивы....   -  person takendarkk    schedule 28.10.2016
comment
@jason, просто из любопытства, вы заинтересованы в отображении каждой буквы алфавита, даже если ее нет на входе? т.е. все буквы 0?   -  person LMc    schedule 28.10.2016
comment
Да, но это не имеет большого значения, почему?   -  person jason    schedule 28.10.2016


Ответы (3)


Вам не нужны никакие методы, но вы определенно можете их сократить:

  • Строка может использоваться как массив символов.
  • Вы можете использовать метод index, чтобы определить, какова позиция буквы в алфавите.
  • Вы можете повторить сжатый список пар из списка алфавита и счетчика, чтобы получить результат.
  • Используйте if letter in alphabet в качестве защиты, чтобы убедиться, что буква действительна для алфавита, вместо жесткого кодирования алфавита. Таким образом, вы даже сможете расширить свой алфавит. (Обратите внимание, что счетчик установлен на длину алфавита).

Вот предложение:

message = input('what is your message? ').upper()
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
counter = [0] * len(alphabet)

for letter in message:
    if letter in alphabet:
        counter[alphabet.index(letter)] += 1

for letter, count in zip(alphabet, counter):
    print(letter, ':', count)
person Uriel    schedule 27.10.2016
comment
Вы также можете изменить строку алфавита, чтобы в конце был пробел, а список c состоял из 27 элементов. Просто чтобы можно было обработать строку с пробелами - person creeperdomain; 28.10.2016
comment
@creeperdomain посмотрите, что я написал о проверке правильности буквы и расширении алфавита. - person Uriel; 28.10.2016
comment
Спасибо, это очень помогло! Есть ли замена zip() и строке 7 в предложенном вами коде? - person jason; 28.10.2016
comment
строка 7 просто увеличивает значение ячейки на единицу, что является очень распространенной практикой. - person Uriel; 28.10.2016
comment
вместо архивации можно перебрать alphabet и распечатать букву, а также счетчик для индекса буквы (counter[alphabet.index(letter)]), как в первом цикле. но зип проще - person Uriel; 28.10.2016
comment
для i в сообщении: print (i,...,count[alphabet.index(i)]) - person jason; 28.10.2016
comment
^ это вроде как работает, но я думаю, что поставил счет не в том месте (мои переменные разные, извините -i - это буква, счетчик - это счет), потому что он печатает, сколько букв в сообщении, но повторяется. - person jason; 28.10.2016
comment
Не знаю, как это исправить :/ Большое спасибо, однако. - person jason; 28.10.2016

Это можно сделать с помощью однострочной инструкции, где мы используем:

  • count метод строки, который возвращает номера элементов, содержащихся в строке
  • chr, которая дает символ из int. chr(65) дает A, chr(66) дает B, ...
  • join функция, которая объединяет строки списка

Результат выглядит так

message = input('what is your message? ').upper()
print('\n'.join([chr(65+i)+':'+str(message.count(chr(65+i))) for i in range(26)]))
person Guillaume Jacquenot    schedule 27.10.2016
comment
ОП не заявил, что участвует в соревновании по кодовому гольфу, но как использовать читаемый стиль для сокращения своего кода. кроме того, повторение всего списка по количеству каждый раз является пустой тратой времени и полиномиальной сложностью, а не линейной. - person Uriel; 28.10.2016
comment
Я признаю, что это не очень легко понять, однако это вводит новые концепции, которые могут заинтересовать начинающего программиста. Кроме того, перебор всего алфавита интересен для сообщений, содержащих более 26 символов! - person Guillaume Jacquenot; 28.10.2016
comment
На самом деле использование этого кода создаст проблемы для пользовательских наборов символов. Он работает только для диапазона az, и если вам нужны пробелы или другие символы, они не будут включены. Вот почему лучше сравнивать каждый символ с набором символов и изучать его позицию, а не жестко кодировать наборы символов. - person Uriel; 28.10.2016

Для очень короткого и элегантного решения используйте модуль Counter из модуля collections:

from collections import Counter

message=raw_input("what is your message?")
message=message.upper()

c = Counter(message)
print c.most_common()

При этом учитываются все виды букв в сообщении. И он может даже быстро отсортировать результат для вас. Вот пример диалога:

«Каково ваше сообщение? Привет, новый питонист!

[(' ', 3), ('E', 3), ('H', 3), ('T', 3), ('I', 2), ('N', 2), ('!', 1), (',', 1), ('O', 1), ('P', 1), ('S', 1), ('R', 1), ('W', 1), ('Y', 1)]"

person Ukimiku    schedule 28.10.2016