Решение без использования модуля Counter
:
text = "приритет"
#выбираем буквы
letters = set(text)
#считаем буквы
count = []
for letter in letters:
count.append((text.count(letter), letter))
count.sort(reverse=True)
print (count)
print(count[0][1])
вывести все буквы с одинаковым количеством вхождений, думаю, сам сможешь.
а этот код выведет:
[(2, 'т'), (2, 'р'), (2, 'и'), (1, 'п'), (1, 'е')]
т
Благодаря наставлению старших товарищей (см. примечание @gil9red), напишу более понятный для наметаного глаза вариант кода без Count
:
text = "приритет"
#считаем буквы
count = sorted([(text.count(letter), letter) for letter in set(text)], reverse=True)
print (count)
print(count[0][1])
Правда, изящно и почти по английски? просто читаешь..
“счетчик равен отсортированному по убыванию списку составленному для каждой буквы из набора букв исходного текста. Причем каждый элемент этого списка состоит из пары: (количество буквы в тексте, буква)
Такой себе однострочный функциональный вариант…
If you want to have all the characters with the maximum number of counts, then you can do a variation on one of the two ideas proposed so far:
import heapq # Helps finding the n largest counts
import collections
def find_max_counts(sequence):
"""
Returns an iterator that produces the (element, count)s with the
highest number of occurrences in the given sequence.
In addition, the elements are sorted.
"""
if len(sequence) == 0:
raise StopIteration
counter = collections.defaultdict(int)
for elmt in sequence:
counter[elmt] += 1
counts_heap = [
(-count, elmt) # The largest elmt counts are the smallest elmts
for (elmt, count) in counter.iteritems()]
heapq.heapify(counts_heap)
highest_count = counts_heap[0][0]
while True:
try:
(opp_count, elmt) = heapq.heappop(counts_heap)
except IndexError:
raise StopIteration
if opp_count != highest_count:
raise StopIteration
yield (elmt, -opp_count)
for (letter, count) in find_max_counts('balloon'):
print (letter, count)
for (word, count) in find_max_counts(['he', 'lkj', 'he', 'll', 'll']):
print (word, count)
This yields, for instance:
lebigot@weinberg /tmp % python count.py
('l', 2)
('o', 2)
('he', 2)
('ll', 2)
This works with any sequence: words, but also [‘hello’, ‘hello’, ‘bonjour’], for instance.
The heapq
structure is very efficient at finding the smallest elements of a sequence without sorting it completely. On the other hand, since there are not so many letter in the alphabet, you can probably also run through the sorted list of counts until the maximum count is not found anymore, without this incurring any serious speed loss.
Shoupie 0 / 0 / 0 Регистрация: 21.01.2014 Сообщений: 20 |
||||
1 |
||||
Определить какой символ встречается в тексте чаще всего27.01.2014, 11:12. Показов 22478. Ответов 1 Метки нет (Все метки)
0 |
Puporev Почетный модератор 64286 / 47585 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
27.01.2014, 11:35 |
2 |
|||
У Вас только буквы а..я, так и написал, можно переделать на любой набор символов
0 |
От автора: как найти в коде JavaScript символ, встречающийся чаще всего, а также подсчитать общее количество повторов? В этой задаче мы будем иметь дело со строками, массивами и объектами. Мы научимся работать с этими типами данных, используя различные методы, которые в итоге дадут нам рабочее решение.
Довольно разговоров, давайте приступим! Здесь вы можете найти код.
У вас уже должна быть настроенная среда разработки для этого курса. Обновите свой клонированный репозиторий, выполнив команду git pull. Внутри папки Beginner перейдите к папке maxRecurringChar. Наша работа для этой задачи будет выполняться здесь. Обязательно следуйте инструкциям в файле index-START.js.
Вызов
Получив строку текста, найдите и верните наиболее часто повторяющийся символ. Например:
maxRecurringChar(‘aabacada’) // возвращает ‘a’ |
Довольно просто, да?
Продумывание алгоритма
Из оператора вызова мы можем сделать вывод, что наша функция имеет только один параметр; строку текста. Нам нужно как-то отслеживать каждый символ в строке, а также количество раз, которое он встречается. Это мы бы описали как карта символов. После того, как мы успешно создадим такую карту, мы сможем легко определить, какой символ имеет больше всего вхождений.
Реализация кода
Из приведенных выше рассуждений вы заметили, что есть одна вещь, которая очень важна, если мы хотим найти подходящее решение этой проблемы. Нам нужно отслеживать каждый символ в строке, а также количество раз, которое он встречается. Как нам это сделать?
Карта символов
Представьте, что вам дали мешок с шарами следующих цветов; зеленый, красный, синий и желтый. Ваша задача — отсортировать их. Интуитивно понятно, что вы должны вынуть шарики из сумки и сгруппировать их по цвету. В конце концов, именно эти группы шаров одинакового цвета помогут вам определить, какое количество шаров каждого цвета существует, и, соответственно, самый часто встречающийся цвет.
Поздравляем! Вы успешно сопоставили шары. Теперь давайте выполним ту же магию с символами. Наше намерение состоит в том, чтобы сопоставить символы с количеством раз их вхождения, как показано ниже. Если бы у нас была строка текста ‘aaabbbcdcb’, мы бы имели:
Чтобы реализовать это, очень удобно использовать объект. Мы перебираем полученный текст и добавляем каждый символ к объекту карты символов в качестве ключа и количество раз, которое он встречается, в качестве значения. Объект будет выглядеть так:
let charMap = { a:3, b:4, c:2, d:1 } |
Вот как мы создаем такой объект из строки **text**:
let charMap = {}; for (let char of text) { if (charMap.hasOwnProperty(char)) { charMap[char]++ } else { charMap[char] = 1; } } |
Инициализировав пустой объект charMap, мы используем цикл for… для перебора строки текста. Для каждого символа мы проверяем, было ли оно сопоставлено (является ли свойством объекта charMap), вызывая метод объекта .hasOwnProperty(). Если это так, мы увеличиваем его значение, в противном случае оно добавляется как свойство и его значение устанавливается равным 1.
Создав карту символов, мы теперь можем сосредоточиться на реальном решении проблемы. Нам нужно вернуть символ, который наиболее часто встречается. Давайте теперь рассмотрим два способа сделать это.
Итерация for…in
JavaScript предлагает различные способы перебора итерируемых объектов. Итерируемый объект в основном представляет собой набор последовательно отформатированных данных. В качестве примера можно назвать строки, массивы, объекты, подобные массиву и т. д. Оператор for… in выполняет итерацию по всем не-символьным , перечисляемым свойствам объекта. Посмотрите, как мы используем это ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function maxRecurringChar(text) { let charMap = {} let maxCharValue = 0 let maxChar = ” for (let char of text) { if (charMap.hasOwnProperty(char)) { charMap[char]++ } else { charMap[char] = 1 } } for (let char in charMap) { if (charMap[char] > maxCharValue) { maxCharValue = charMap[char] maxChar = char } } return maxChar } |
Вы заметите, что в приведенной выше функции maxRecurringChar мы используем фрагмент, рассмотренный ранее, для генерации карты символов полученной строки текста. Для циклического прохождения объекта charMap мы инициализируем в начале две переменные.
maxCharValue используется для хранения максимального значения, которое встречается в точке каждой итерации в цикле for… in.
maxChar используется для хранения символа с наибольшим значением на каждой итерации.
Выполняя цикл for… in, мы проверяем, имеет ли оцениваемый символ большее значение, чем наше maxCharValue, которое изначально равно нулю. Если это так, он становится новым maxCharValue и символ сохраняется в maxChar. Если это не так, мы переходим к следующему символу.
В конце мы возвращаем maxChar, который теперь содержит символ с наибольшим значением, и, таким образом, наиболее повторяющийся. Все понятно? Давайте теперь попробуем другой способ.
Формирование массивов из карты символов
В ES6 мы можем выполнять различные вычисления для объектов, сначала преобразовывая их в массивы. ES6 — это в основном EcmaScript 6 / EcmaScript 2015. EcmaScript — это просто стандарт, на котором основан JavaScript. Итак, ES6 — это новая версия или новый стандарт JavaScript. В ES6 появилось много новых функций, таких как концепция классов, теги шаблонов, функции стрелок и т. д.
Давайте посмотрим, как это работает:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function maxRecurringChar(text) { let charMap = {} let charArray =[] let vaulesArray = [] let maxCharValue = 0 for (let char of text) { if (charMap.hasOwnProperty(char)) { charMap[char]++ } else { charMap[char] = 1 } } charArray = Object.keys(charMap) vaulesArray = Object.values(charMap) maxCharValue = Math.max(...vaulesArray) return charArray[vaulesArray.indexOf(maxCharValue)] } |
В приведенном выше фрагменте кода мы снова создаем карту символов с первоначально рассмотренным фрагментом кода. Далее мы используем синтаксис ES6 для формирования массивов из карты символов. Сначала массив ключей charMap (все символы в тексте), известный как charArray, а затем массив значений (число вхождений), известный как valuesArray, упорядоченных в соответствующем порядке.
Для карты символов, которую мы визуализировали ранее (например, «aaabbbcdcb»), у нас было бы что-то вроде этого:
charArray = [‘a’, ‘b’, ‘c’,‘d’] valuesArray = [4,3,2,1] |
Далее мы используем встроенную функцию Math.max() для поиска максимального значения в массиве значений и сохраняем это значение в переменной maxCharValue.
Наконец, мы используем метод .indexOf() для поиска valuesArray для позиции maxCharValue. Это необходимо, так как положение maxCharValue в valuesArray соответствует положению символа в charArray с этим числом вхождений.
Таким образом, при получении индекса (позиции) мы возвращаем символ, занимающий ту же позицию в charArray. Это самый часто встречающийся символ. Мы наконец сделали это! Теперь давайте проверим наши решения.
Тестирование
Тестирование с помощью Jest. Для каждого решения, приведенного выше, выполните следующую команду, чтобы запустить тесты:
npm run test maxRecurringChar |
Вот результаты:
Итерация for…in
Формирование массивов из карты символов
Надо отметить, что оба решения приняты во всех случаях.
Тестирование производительности с помощью JSPerf. Здесь, на JSPerf, мы сравниваем оба решения, чтобы увидеть, какое из них работает лучше. Смотрите результаты ниже:
Всегда проверяйте тесты самостоятельно, чтобы убедиться, что у вас есть похожие результаты. Результат, как приведенный выше, приводит нас к выводу, что: For … In итерация является самой быстрой. При использовании метода Arrays отставание составляет примерно 30%.
Практическое применение
Вы найдете методы, рассмотренные в этой задаче, полезными при собеседовании на JavaScript и проблемам кода. Кроме того, они могут использоваться на более продвинутом уровне в поисковой оптимизации (SEO) для определения плотности ключевых слов в части контента.
Заключение
Из этой задачи мы научились управлять объектами, используя различные методы JavaScript. Мы рассмотрели два способа решения проблемы и определили, что цикл For… in лучше оптимизирован. Тем не менее, оба рассматриваемых решения отлично работают и могут быть использованы на собеседовании.
Автор: Obosi Philip
Источник: //scotch.io/
Редакция: Команда webformyself.
Для входной строки вычислите символ, который встречается в ней чаще всего.
Ученик
(180),
закрыт
5 месяцев назад
Аглая Шниц
Искусственный Интеллект
(114810)
5 месяцев назад
print((lambda x:sorted((x.count(y),y) for y in set(x))[-1][1])(input()))
ТАТУНЯУченик (180)
5 месяцев назад
Числа Фибоначчи — элементы числовой последовательности 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, …, в которой первые два числа равны либо 1 и 1, либо 0 и 1, а каждое последующее число равно сумме двух предыдущих чисел.
Будем нумеровать числа Фибоначчи начиная с нуля. Получая номер числа Фибоначчи, напечатайте его.
Формат ввода
8
Формат вывода
21
ПОМОГИТЕ ПОЖАЛУЙСТА ГДЕ У МЕНЯ ОШИБКА
fib1 = fib2 = 1
n = input(“8 “)
n = int(n) – 2
while n > 0:
fib1, fib2 = fib2, fib1 + fib2
n -= 1
print(fib2)
ТАТУНЯУченик (180)
5 месяцев назад
СПАСИБО!!! ВСЕ ВЕРНО!!! ПОМОГИТЕ СДЕЛАТЬ ЕЩЕ ОДНО ЗАДАНИЕ.
На вход вашей программе подается строка со словами, разделенными пробелом. Напишите ее как заголовок в NY Times. Может использоваться как кириллица, так и латиница.
Формат ввода
Python изучают все больше людей
Формат вывода
Python Изучают Все Больше Людей
ТАТУНЯУченик (180)
5 месяцев назад
ПОМОГИТЕ ПОЖАЛУЙСТА, ХОТЯ БЫ С НЕКОТОРЫМИ ЗАДАНИЯМИ,КОТОРЫЕ СМОЖЕТЕ:
1.Напишите команду запускающую отладчик Python в командной строке для файла debug.py на диске С.
2.Напишите команду запускающую отладчик в Python IDE PyCharm.
3.Напишите команду запускающую Doctest в командной строке с выводом результатов тестов Python в командной строке для файла test.py на диске D.
4.Напишите команду запускающую профилизатор Python в командной строке для файла profile.py на диске С.
Андрей
Высший разум
(267552)
5 месяцев назад
За час ты опубликовала 5 задач очень разного уровня, которые не могут встретиться в одной контрольной работе. И такое поведение ты демонстрируешь последние 6 дней. Похоже, ты открыла сайт по платному решению программистских задач и теперь пытаешься заработать за наш счёт – сама ничего не зная и не умея.
ТАТУНЯУченик (180)
5 месяцев назад
ЗДРАВСТВУЙТЕ, ПОМОГАЮ СЫНУ, А САМА В ЭТОМ ПРЕДМЕТЕ НИЧЕГО НЕ ПОНИМАЮ, ПОЭТОМУ КАЖДЫЙ ДЕНЬ ЗАДАЮ ВОПРОСЫ. А ВАМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!!
Дмитрий Филюшкин
Мудрец
(11299)
5 месяцев назад
Наталья, здравствуйте!
Вот программа для Вас:
# Ввожу строку
s = input()
# Для начала считаю, что в самый первый символ строки "s" является
# символом с максимальным количеством повторений
m = s[0]
# Запускаю поиск символа с помощью цикла
for c in s:
# Сравниваю количество вхождений символов:
# если количество вхождений символа из переменной "c" больше,
# чем количество вхождений символа из переменной "m",
# тогда максимальным считаю символ из "c"
if s.count(c) > s.count(m):
m = c
# Печатаю результат
print(m)