Как посчитать количество букв в слове python
Перейти к содержимому

Как посчитать количество букв в слове python

Как посчитать кол-во определённых букв в слове, сгенерированным циклом — Python

Всем привет. Несколько дней ломаю себе голову и никак не могу найти решение поставленной задачи. Может кто-то подскажет или даст нужное направление?

В общем, суть задачи такова: нужно найти кол-во слов, в которых встречаются три буквы "А".

Ещё у нас на руках имеются следующие данные:

1. 5 букв [A, B, C, D, E];

2. Цикл, который перебирает вышеуказанные символы и генерирует из них новые слова;

3. А так же знаем, что сами слова, должны состоять из 8 символов. Цикл я написал, там всё понятно, а вот как проверить сгенерированные циклом слова на наличие 3-х букв "А" — не понимаю (именно трёх, а не 4 и выше, т.к. первое сгенерированное слово имеет 8 букв "А", а по условию задачи, нужно найти слова, в которых их будет только 3 и не более). Мой код (да, он может и не идеальный, но рабочий, учусь, так сказать):

Заранее благодарю за ответ, наводку или доработанный код. И, пожалуйста, можно с объяснить что к чему, всё-таки эта задача меня извела хорошо.

Статья Считаем количество знаков в тексте

В сети много онлайн-сервисов для подсчёта слов с пробелами и без. Это может быть полезно при написании статей фрилансерами, когда есть задание на определённое количество знаков.
Но сегодня мы напишем небольшую программку, с бОльшим функционалом. Она также подсчитает количество слов, а самое главное, выведет сколько встречается каждый символ. Это очень полезно для расшифровки закодированных текстов — частотный анализ символов.

Для начала импортируем модуль pyperclip и вставим поясняющий текст.

Потом вставим скопированный текст

Подсчитаем количество символов с пробелами, без пробелов, и количество слов.

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

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

max возвращает одно значение (максимальное), а не пару

max возвращает одно значение (максимальное), а не пару

Но это работает

А, блин, точно. Я что-то протупил, что там пара.

Ну да, значит только return print()

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

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

туплю, ткните, что в этом выражении не так? Как правильно передать символ?

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

В python есть wildcard?

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

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

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

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

В питон3 есть такое.

Это уже знаю, но спасибо.

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

Кстати да, только буквы. Но это уже другая история.

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

Обычно подсчет чего-то и вывод top N делается так: https://en.wikipedia.org/wiki/Min-max_heap

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *