LINUX.ORG.RU

python, практика, подсчет букв...

 ,


0

1

задача в двух словах: «подсчитать количество символов в строке, вывести буковку с наибольшим упоминанием».

Пример: «Hello World!», вывод - «l».

Написал такое:

def func(text):                                                           
    text = text.lower()                                                      
    a, b = max([(text.count(i), i) for i in set(text)])                      
    return print(b)
Платформа (checkio) ругается на тестах. Где я напортачил?

Ответ на: комментарий от x3al

Круть. Всё изменилось. А подскажите, как правильно выкусывать объекты из кортежа, отбросив ненужные переменные?

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

Что это значит?

Ты ж это написал, у тебя надо спросить. print выводит значение в stdout и возвращает None. Соответственно, твоя функция всегда возвращает None. Наверное ты хотел вернуть значение, букву, то есть:

return b
Или сначала вывести на экран, потом вернуть:
print(b)
return b

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Сейчас попробую. Да, выводит None. Прочел по print(). Спасибо.

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

Передать куда? Функция должна его возвращать, так ведь? Тогда правильно так:

return b

Ну и вызов твоей функции:

most_frequent_letter = func("Hello world!")
print(most_frequent_letter)
# Ну или там:
print(func("Hello world!"))

Кстати, у тебя в «задании» возможно ошибка, а возможно нет, если нет, то ошибка в коде. Ты говоришь «вывести буковку с наибольшим упоминанием», а у тебя выводится «символ с наибольшим упоминанием» (в более длинных строках это часто будет пробел, например). Что что-то не так (и нужны действительно именно буквы) на мысль наталкивает .lower().

P. S. Кстати, квадратные скобки не нужны. max и с генератором нормально работает, нет смысла делать именно список и выделять больше памяти. Ну и минус две скобки.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 2)
Ответ на: комментарий от masterdilly

А что ты имел ввиду тогда? _ это просто имя переменной(такое же как foo или x), которое обычно используют для переменной, которая тебе не нужна.

pawnhearts ★★★★★
()
Ответ на: комментарий от masterdilly

Кстати, если это не собственно задание, а реальная задача, то что функция должна делать, если две разных буквы встречаются одинакое количество раз? Сейчас по сути, возвращает любую из ни, можно сказать, случайную (какая раньше в переборе set'а окажется). Не уверен, что это желаемое поведение.

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Решение - песня:

import string

def func(text):
    text = text.lower()
    return max(string.ascii_lowercase, key=text.count)

По вопросу использования:

Как это используется: Для большинства задач по дешифрованию >необходимо знать частоту появления различных букв в подобном >тексте. Для примера, мы легко можем взломать одноалфавитный шифр >подстановки, если мы знаем вероятность появления букв. Это также >может быть полезной информацией для лингвистов.

P.S. Я просто прочел половину Лутца, надо практику. Кроме checkio.org пока и не нашел нормального.

masterdilly
() автор топика
Ответ на: комментарий от Psych218

По поведению:

Если в тексте две и больше буквы с одинаковой частотой, тогда >результатом будет буква, которая идет первой в алфавите.

masterdilly
() автор топика
Ответ на: комментарий от pawnhearts

Спасибо. А там показывают решения других участников? Надо же набираться правильного? Я смотрел решения, например, на киберфоруме, так программа работает, но читать сам код неприятно. Написано без использования встроенных методов, полуСи...

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

Незнаю, на hackerrank есть типа обсуждения задач.

Решения, которые тебе показывают не всегда самые лучшие. Часто всякие однострочники и хаки, но в реальной разработке такое писать не желательно.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

Вот такое можно увидеть только благодаря возможности посмотреть решения (есть и рейтинг) других пользователей:

from string import ascii_lowercase as letters
checkio = lambda text: max(letters, key=text.lower().count)
masterdilly
() автор топика
Ответ на: комментарий от masterdilly

checkio = lambda text: max(letters, key=text.lower().count)

Так писать не рекомендуется. Это ничем не лучше, чем нормальное.

from string import ascii_lowercase
def checkio(text):
    return max(ascii_lowercase, key=text.lower().count)

А там чисто ухудшение читабельности ради ухудшения читабельности. Функции надо определять через def (на то оно и есть в языке, сразу видно, что функция, а не фигня какая-то), а не лямбды, лямбды для другого (как раз когда имя функции и не нужно). А зачем ascii_lowercase as letters — вообще не понятно, чисто чтобы лапши побольше, чтобы когда увидишь (в реальном проекте, не на две строки) это letters, искать, где же такое letters объявлено.

Чисто пример, как делать не надо. Хотя полагаю, юзер не специально, а наверное там количество строк просто считается — чем меньше, тем лучше. Иногда это, конечно, хорошее правило, но очень далеко не всегда, и не является целью. readability counts.

P. S. А ещё ascii_lowercase — это не все буквы. С кириллицей не будет работать.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)
Ответ на: комментарий от Psych218

Задания то на английском. Главное - знания, опыт. А то, что нарутил лишнего, вместо «import ascii_lowercase», согласен на 200%.

masterdilly
() автор топика
Ответ на: комментарий от Psych218

text.lower()

Я бы и это на отдельной строчке написал, как в примере выше. Если бы там была подобная конструкция ещё длиннее и посреди неё выпало исключение, понятней в чем проблема.

Вообще мне вариант с collections.Counter нравится больше, он более понятный и подойдет для других подобных задач с минимальными изменениями. ИМХО.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

Не, композиция - это нормально. Вот по поводу переименования и лямбды я согласен. А композиция, повторю, нормально.

masterdilly
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.