Найти максимальное количество строчных букв в строке
Обучаюсь Python только пару недель, извините за нелепый код. В кратце, нужно написать программу, которая находит самую часто встречающуюся букву в строке и вывести ее. Все буквы должны быть приведены к нижнему регистру. Если в результате анализа получено несколько ответов, следует вывести первый по алфавиту.
Анализируется только кириллица, латинские символы не могут быть.
Я написал код, но какой-то тест он не проходит. А какие именно входные данные на тесте, Яндекс почему-то не пишет.
Может кто-то так может подсказать какие входные данные моя программа могла бы обрабатывать неверно.
lst1 = ['а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л',
'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'x', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я']
lst2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
while True:
stroka = input()
if stroka == 'ФИНИШ':
break
else:
strokanew = stroka.lower()
for elem in strokanew:
if elem in lst1:
index = lst1.index(elem)
lst2[index] += 1
else:
continue
maxvalue = 0
maxvalueindex = 0
maxvaluesymbol = 'я'
for i in range(len(lst2)):
if lst2[i] > maxvalue:
maxvalue = lst2[i]
maxvalueindex = i
maxvaluesymbol = lst1[i]
elif lst2[i] == maxvalue:
if lst1[i] < maxvaluesymbol:
maxvalue = lst2[i]
maxvalueindex = i
maxvaluesymbol = lst1[i]
print(lst1[maxvalueindex])
В первой части кода прошел по строкам и заполнил частотные списки. Во второй - нашел максимальное значение частоты, сопоставил с буквой и вывел, а также сделал проверку на случай если максимальные частоты равны. p.s. хотелось бы понять какой тест код не проходит и как это исправить, а не получить ваш очень хитрый и короткий код в 2 строки, вместо моей простыни)
Вот тут есть полное описание задачи и несколько вариантов решений.
Ответы (4 шт):
Возможно, тест на скорость не пройден.
.index
по списку работает медленно, это фактически перебор списка каждый раз. Попробуйте использовать словарь для счётчиков. Хотя для длины списка 33 это вроде бы не сильно критично.А ещё у вас в списке
lst1
букваx
латинская, а не русская, из-за этого русская буквах
не посчитается. Если она где-то в примерах самая частая, то на такой пример ваш код неправильно ответит. Это, кстати, легко обнаружить, если сразу ввести "ФИНИШ". В ответ будет выведено "x", а не "а" и дальше легко догадаться, почему так происходит.
'''
Написать программу, которая находит самую часто встречающуюся букву в строке и вывести ее.
Все буквы должны быть приведены к нижнему регистру.
Если в результате анализа получено несколько ответов, следует вывести первый по алфавиту.
'''
import os
import collections
def most_common_letter(s):
# Приводим строку к нижнему регистру
s = s.lower()
# Считаем частоту каждой буквы
counter = collections.Counter(s)
# Находим максимальную частоту
max_count = max(counter.values())
# Находим все буквы с максимальной частотой
most_common = [char for char, count in counter.items() if count == max_count]
# Возвращаем первую по алфавиту букву
return min(most_common)
# Пример строки
example_string = "аББвгдеёжзИйклмнопрстуФхцчшщъыьэюяабвгдеёжзийклиіємнопрсТуфхцчшщъыьэюяабвгдеёжзийклмнопРстуфхцчшщъыьэюяабвгдеёжзийклмнопрстуфхцчшщъыьэюяиіє"
result = most_common_letter(example_string)
print(f"Самая часто встречающаяся буква: {result}")
print("\nНажмите любую клавишу для продолжения...")
os.system("pause > nul" if os.name == "nt" else "read > /dev/null")
Вариант подкину
s = "фвыабоылфваодЫВАДЛЬГХЩЦЮУБКЙЭафшгклу4ыфжшь сшфьыждульб ; jksldfkmлдозщшыуа 462654"
s = s.lower()
# Подсчет всех русских букв
result = {}
for char in s:
if 1072 <= ord(char) <= 1103 or ord(char) == 1105:
result[char] = result.get(char, 0) + 1
# Получение первой в алфавитном порядке
max_value = max(result.values())
max_keys = [key for key, value in result.items() if value == max_value]
print(min(max_keys))
Вроде как comprehensions
побыстрее циклов с условиями.
Не хранится список из русских букв, здесь орагнизовано сравнение значений в Unicode. Поскольку буквы идут по порядку и мы можем определить, что для "а" = 1072
и для "я" = 1103
.
Получение первого по алфавиту можно использовать min
из всех ключей, у которых одинаковы значения счетчиков
Раз уж начали давать продвинутые ответы, то вот довольно простой вариант со счётчиком в словаре. Без использования библиотек.
text = "KЛОЛОjjldfs(*Y*7677986KророНАНЕАнеаkнешаглЛРГ!"
count = dict.fromkeys("ёйцукенгшщзхъфывапролджэячсмитьбю", 0)
for ch in text.lower():
if ch in count:
count[ch] += 1
print(min(count.items(), key=lambda x: (-x[1], x[0]))[0])