Символ встречающийся чаще всего python

Определить символ, который чаще всего встречается в файле после двух одинаковых символов

Задача: Текстовый файл содержит только заглавные буквы латинского алфавита (ABC…Z). Определите символ, который чаще всего встречается в файле после двух одинаковых символов. Например, в тексте ‘CCCBBABAABCC’ есть комбинации CCC, CCB, BBA и AAB. Чаще всего — 2 раза — после двух одинаковых символов стоит B, в ответе для этого случая надо написать ‘B’. Мой код (ответ выдаёт неверный):

file = open('88.txt') all = list(file.readline()) litteral = [] count, max, wMax = 0, 0, '' for i in range(0, len(all)-2): if all[i] == all[i+1]: litteral.append(all[i+2]) for k in range(0, len(litteral)-1): if litteral[k] == litteral[k+1]: count+=1 else: count = 0 if count > max: max = count wMax = litteral[k] print(wMax, litteral) 

Файл с данными: https://disk.yandex.ru/d/mUCkZfFCA13ccg
Верный ответ для данных из файла: ‘K’ Прошу помочь разобрать задачу или как-то исправить мой код.

++ за отлично оформленный вопрос! Понятная формулировка задачи в виде текста (не фото), присутствует собственная попытка решения, пример входных данных и ожидаемый результат. Было бы здорово если бы все новые участники SO так же оформляли свои вопросы)

@MaxU вопрос только оформлен хорошо, но сам, «вот моя задачка, я как-то решил, исправьте мне» — плох и бесполезен. Даже входные данные не включены в тело вопроса, в по ссылке которая протухнет через неделю.

@Kromster, согласен, заголовок можно было бы улучшить. Но по сравнению с другими «учебными» вопросами — этот оформлен почти безупречно) ЗЫ переименовал заголовок

@MaxU на всякий случай, напомню, что SO это не сбор условий задачек и не онлайн база решателей задачек за студентов, а сбор базы знаний. То есть хороший вопрос должен был бы иметь вид «Как найти символ, который чаще всего встречается в файле после двух одинаковых символов», и в таком виде — закрыт после непродолжительно отладки.

Читайте также:  Java spring create bean in runtime

@Kromster, повторюсь — все познается в сравнении. По сравнению с другими «учебными» вопросами этот оформлен отлично, особенно если учесть, что автор новичек (это его первый вопрос)

4 ответа 4

Ладно, добавлю и я свой вариант:

from collections import Counter with open('88.txt') as f: text = f.read() counter = Counter(c for a,b,c in zip(text,text[1:],text[2:]) if a == b) print(counter.most_common(1)[0][0]) 

@MaxU Ну, на самом деле вот как-раз этот фрагмент не выглядит элегантным, но строка вычисления в целом по-моему выглядит бешено понятной, а я люблю, когда всё понятно )

@MaxU Чтобы не повторяться можно написать zip(*(text[i:] for i in range(3))) , но что-то это не выглядит проще, ладно %)

нет, это будет явным ухудшением — в оригинальном варианте намерения автора очень понятно, а здесь — нет 🙂

Я, кажется, понял, как вы хотели подсчитать максимальное количество символов, и если мое понимание правильное, то вы забыли написать litteral.sort() перед вторым циклом. Кроме этого есть еще небольшая ошибка, из-за которой count для каждой буквы на один меньше, чем должен быть. С исправлением ваш код будет выглядеть так:

file = open('88.txt') string = list(file.readline()) #all - это стандартная функция в питоне, поэтому не стоит к ней что-то присваивать litteral = [] count, max_count, max_letter = 1, 0, '' #max - тоже функция, поэтому его тоже не стоит использовать for i in range(0, len(string) - 2): if string[i] == string[i+1]: litteral.append(string[i+2]) litteral.sort() for k in range(len(litteral)-1): if litteral[k] == litteral[k+1]: count += 1 else: count = 1 if count > max_count: max_count = count max_letter = litteral[k+1] print(max_letter) #K 

Я добавил сортировку, исправил пару багов и внес пару правок, но это ваш код.

Вообще, можно быстрее, да и кода поменьше:

file = . string = . count = [0] * 26 #можно заменить на словарь for i in range(len(string) - 2): if string[i] == string[i + 1]: count[ord(string[i + 2]) - ord('A')] += 1 res = max((count[i], i) for i in range(26)) res_letter = chr(res[1] + ord('A')) print(res_letter) #K 
. count = for i in range(len(string) - 2): if string[i] == string[i + 1]: count[string[i + 2]] += 1 res = max(count, key=count.get) print(res) 
from collections import Counter . count = Counter() for i in range(len(string) - 2): if string[i] == string[i + 1]: count[string[i + 2]] += 1 print(count.most_common(1)[0][0]) 

Источник

Как найти самый частый символ в строке?

Смотрел готовые решения, но ничего подходящего не нашел, либо они были сложными и надо было подключать модуль Counter.

Можно ли как-то проще решить?

Простой 2 комментария

kshnkvn

foo = 'cccc8923jbbdkcc' max_item = lambda s: max(t := , key=t.get) max_item(foo) # 'c'

sswwssww

string = 'fgfhsadsssssllfd' counted_chars = <> for char in string: if char in counted_chars: counted_chars[char] += 1 else: counted_chars[char] = 1 print(max(counted_chars))
from collections import defaultdict string = 'fgfhsadsssssllfd' counted_chars = defaultdict(int) for char in string: counted_chars[char] += 1 print(max(counted_chars))

p.s.: я мягко говоря в шоке от того что тут предлагают все возможные заковыристые(привет дзен Python ) и не работающие даже на p.s. 2: лучше юзать Counter

kshnkvn

sswwssww

kshnkvn

sswwssww

5f88a4a6bb588538726155.jpeg

Ivan Yakushenko, во вселенной где есть PEP 8, например.

kshnkvn

sswwssww, ой, прости пожалуйста, как я мог забыть за pep, это же спецификации, а не соглашение и его нужно придерживаться всегда и везде.
P.S. Только не обижайся, у меня нет цели тебя оскорбить или задеть, просто автор «смотрел готовые решения» и они ему не подошли, предложил вариант с учетом некоторого нововведения в python 3.8 и раз ему оно подошло — хорошо и не более.
P.S.2. Не нужно умничать, когда сам не в состоянии прочитать условие, которое в 3х предложениях повторяется 3 раза.
P.S.3. Не нужно обвинять кого то в своей собственной ошибке.

sswwssww

Ivan Yakushenko, твой код херня полная, вот что я хочу сказать. Он нарушает дзен Python и PEP 8, доставляет проблемы при просмотре трассировок ошибок, еще и медленно работает за счет избыточности. Код должен быть таким чтобы ты просто читал его как текст, а не ребусы решал. Поверь, никто не хочет ковыряться в выпендреже на 1 строке, который еще и работает только в 3.8+ . «Не нужно обвинять кого то в своей собственной ошибке.» — к чему это вообще сказано, хрен его знает.
p.s. Как думаешь, почему лямбда функции называют анонимными?
p.s. 2. PEP 8 нужно придерживаться везде где это можно сделать, этот пример явно относится к этой категории.
p.s. 3. Прости, добавил вызов одной функции специально для тебя, теперь соответствует вопросу.

string = 'fgfhsadsssssllfd' counted_chars = <> for char in string: if char in counted_chars: counted_chars[char] += 1 else: counted_chars[char] = 1 print(max(counted_chars))

kshnkvn

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

Ты прям опрос проводил среди всех людей связанных с программированием и прям 100% из них без исключительно этого не хочет?

К тому, что «когда куратор тега Python дает имя лямбда функциям и не такое проморгаешь.». У тебя помимо невнимательности еще и память так себе.

Не, не прощаю, не люблю поговорку «лучше поздно, чем никогда», раз облажался, так прими это с гордостью.

sswwssww

kshnkvn

sswwssww, врешь, читал, просто тебе ответить нечего. Как итог данного замечательного диалога ты — невнимательный, тщеславный врунишка.

sswwssww

Ivan Yakushenko, я это написал к тому, что нет смысла говорить о том как должен выглядеть хороший код человеку которому «вообще плевать» на код. «Дальше не читал» — это выражение-мем означающее не то что реально не читал, а то что можно не читать. Так что твои обвинения безосновательны.

kshnkvn

Процитируй мне моё сообщение, где мне «плевать на код». Я так понимаю к уже определенным твоим качествам стоит добавить еще и плохое зрение.

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

Процитируй мне моё сообщение, где я тебя хоть в чем то обвиняю.

Просто напоминаю — это не я, а ты написал ответ в стиле «смотрите какой я крутой, а все дурачки», но при этом облажался с решением. Ха.

И что бы не опускать тему про pep — это всего лишь общепринятое универсальное соглашение, но универсальность не покрывает специфику, соответственно в некоторых командах/компания данное соглашение обсуждается и некоторые пункты, а иногда и многие могут опускаться в угоду различным обстоятельствам.

sswwssww

Ivan Yakushenko, тебе плевать на скорость работы кода, плевать на удобочитаемость, плевать на pep8, плевать на дзен Python, плевать на то что твой код не работает на любых версиях ниже 3.8.
Ты обвинил меня во вранье как минимум.
Дружок, я знаю что такое pep8, ты можешь писать хоть 1000 символов на 1 линии и кричать что пеп это лишь советы, но попробуй пописать в таком стиле в любой более менее уважающей себя компании, поверь тебя вышвырнут в первый же день.
Русский язык это лишь инструмент выражения мыслей, и помимо этого инструмента у людей есть такие как сарказм, ирония и т.д., печально если ты не умеешь ими оперировать и воспринимаешь любой текст — буквально.
Забавно что человек пишущий уродливый код ради выпендрежа обвиняет меня выпендреже.
Ты подаёшь плохой пример новичкам, я тебе на это указал, вот и все, к чему раздувать тут комменты.

kshnkvn

Выключай фантазию, она тебя не туда ведет. Я написал всего одну строчку кода (3, если быть максимально точным), исходя из посыла автора в контексте того, что он уже что то гуглил и пробовал и «стандартные» решения, почему то, ему не подошли. Это единственная причина по которой была написана тут это строчка. Все, больше я не написал ни слова, кроме единственного условия, при котором эта строчка будет работать. С чего ты делаешь выводы про мой «выпендреж» мне не ясно. Или по твоему все люди, которые увлекаются код-гольфингом — выпендрежники?

Единственный человек, который тут выделывается — это ты. Еще раз напоминаю — ты написал сообщение в стиле «я в шоке, какие тут все глупые, вот смотри как все должно быть» и при этом умудрился облажаться не выполнив условие, которое написано 3 раза в 3х предложениях. Серьезно? Это насколько глупым и самовлюбленным нужно быть, что бы после этого вообще хоть что-то писать.

но попробуй пописать в таком стиле в любой более менее уважающей себя компании, поверь тебя вышвырнут в первый же день

Если у тебя не хватает мозгов разделять код-гольфинг и работу в любом её проявлении, то мне тебя искренне жаль.

тебе плевать на скорость работы кода, плевать на удобочитаемость, плевать на pep8, плевать на дзен Python, плевать на то что твой код не работает на любых версиях ниже 3.8

Можешь, пожалуйста, расписать мне твою логическую цепочку на основании которой ты сделал столько многозначительных выводов всего по 1 строчке кода?

sswwssww

Процитируй мне моё сообщение, где мне «плевать на код». Я так понимаю к уже определенным твоим качествам стоит добавить еще и плохое зрение.

Он нарушает дзен Python и PEP 8
Вообще плевать, строка написана из спортивного интереса и не более.

Просто напоминаю — это не я, а ты написал ответ в стиле «смотрите какой я крутой, а все дурачки», но при этом облажался с решением. Ха.

ты написал сообщение в стиле «я в шоке, какие тут все глупые, вот смотри как все должно быть» и при этом умудрился облажаться не выполнив условие

— x2. НЕ ВЫПОЛНИВ УСЛОВИЕ!11 ужас, забыл добавить max() к выводу, ЭТО ЖЕ ВООБЩЕ В КОРНЕ ВСЕ МЕНЯЕТ!!1 НУЖНО ВСЮ ПРОГРАММУ ПЕРЕПИСЫВАТЬ.
Если подводить итоги, ты называл меня: невнимательным, тщеславным, врунишкой, глупым, самовлюбленным, у меня плохое зрение и память.
Цитируем тебя же, до этого:

От меня ты услышал: выпендрежник, у тебя хреновый код.
И я называл тебя так обоснованно, в отличие от тебя.
Если по существу, твой код в одну строчку годиться только для выпендрежа, и все, точка. Его можно использовать только для того чтобы покрасоваться перед новичками. Если ты считаешь что так можно писать на проде или любом другом проекте — то ты глуп, объективно. Ты не можешь утверждать обратное, как бы тебе не хотелось выйти отсюда победителем, т.к. ты изначально был в проигрышной позиции. Не вижу смысла продолжать этот пустой диалог.

Источник

Оцените статью