Я пытаюсь создать программу, ничего не импортируя. Программа позволяет пользователю ввести отрывок, а затем выводит, сколько букв А в сообщении, сколько букв Б и т. д. Так что это работает... просто ОЧЕНЬ долго. Я новичок в кодировании, и я знаю, что есть способ упростить приведенный ниже код с помощью def, но я не совсем уверен, как это сделать. Кто-нибудь может помочь?
Попытка создать программу python, но упрощенную с помощью def
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
Вы также можете изменить строку алфавита, чтобы в конце был пробел, а список c состоял из 27 элементов. Просто чтобы можно было обработать строку с пробелами
- person creeperdomain; 28.10.2016
@creeperdomain посмотрите, что я написал о проверке правильности буквы и расширении алфавита.
- person Uriel; 28.10.2016
Спасибо, это очень помогло! Есть ли замена zip() и строке 7 в предложенном вами коде?
- person jason; 28.10.2016
строка 7 просто увеличивает значение ячейки на единицу, что является очень распространенной практикой.
- person Uriel; 28.10.2016
вместо архивации можно перебрать
alphabet
и распечатать букву, а также счетчик для индекса буквы (counter[alphabet.index(letter)]
), как в первом цикле. но зип проще
- person Uriel; 28.10.2016
для i в сообщении: print (i,...,count[alphabet.index(i)])
- person jason; 28.10.2016
^ это вроде как работает, но я думаю, что поставил счет не в том месте (мои переменные разные, извините -i - это буква, счетчик - это счет), потому что он печатает, сколько букв в сообщении, но повторяется.
- person jason; 28.10.2016
Не знаю, как это исправить :/ Большое спасибо, однако.
- 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
ОП не заявил, что участвует в соревновании по кодовому гольфу, но как использовать читаемый стиль для сокращения своего кода. кроме того, повторение всего списка по количеству каждый раз является пустой тратой времени и полиномиальной сложностью, а не линейной.
- person Uriel; 28.10.2016
Я признаю, что это не очень легко понять, однако это вводит новые концепции, которые могут заинтересовать начинающего программиста. Кроме того, перебор всего алфавита интересен для сообщений, содержащих более 26 символов!
- person Guillaume Jacquenot; 28.10.2016
На самом деле использование этого кода создаст проблемы для пользовательских наборов символов. Он работает только для диапазона 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