Массив имеет такой вид (внутри массива строка). А нужно посчитать самую часто встречающуюся букву.
Напишите пожалуйста какой командой это можно сделать, пробовал через Counter, но он выводит всю строку целиком
>>> import itertools >>> import collections >>> >>> lst = ['abc', 'def', 'abb', 'aaa'] >>> >>> chars = itertools.chain.from_iterable(lst) >>> out = collections.Counter(chars).most_common()[0][0] >>> out 'a' >>>
def count_letters(lst): """ Count letters in list of strings Return dictionary """ letters = dict() for item in lst: for letter in item: if letter in letters: letters[letter] += 1 else: letters[letter] = 1 return letters def find_max(lst): """ Return dictionary key with maximum value """ letters = count_letters(lst) return max(letters, key=letters.get) print(find_max(['abc', 'def', 'abb', 'aaa'])) print(find_max(['aabbc', 'def', 'abbbb', 'aaa']))
for i in range(1000): print(find_max(['ссс', 'bbb'])
OceanНадо сначала поставить задачу.
1) Нужно ли модицифировать решение, чтобы корректно обрабатывался случай, когда самых часто встречающихся букв больше одной? Что вообще будет корректным ответом в этом случае? Я подумала, что стоит перечислить все буквы, которые наиболее часто встречаются в массиве.
Массив имеет такой вид (внутри массива строка). А нужно посчитать самую часто встречающуюся букву.
Массив имеет такой вид (внутри массива строка). А нужно посчитать самые часто встречающиеся буквы.
Массив имеет такой вид (внутри массива строка). А нужно посчитать самую часто встречающуюся букву. Если их несколько, то посчитать самые часто встречающиеся буквы.
OceanОн уже стал упорядоченным
Словарь в python неупорядоченная коллекция
Dictionaries preserve insertion order. Note that updating a key does not affect the order. Keys added after deletion are inserted at the end.В версии 3.6 это появилось и в версии 3.7 это закрепилось официально.
py.user.nextДа, нашла!
В версии 3.6 это появилось и в версии 3.7 это закрепилось официально.
py.user.nextПоняла. Я прост большинство задач, которые тут в темах пишут, в книгах упоминают, не уверена, что правильно понимаю, что подразумевается. Выглядит неполным условием задачи и хз как с ним быть.
Надо сначала поставить задачу.
py.user.nextДа, я после того, как тебе написала, поняла, что может быть еще и вариант, что букв в исходном массиве вообще не было. Кроме того, что массив строк будет пустой, там кроме букв могут встречаться еще и числа, и символы, которые не являются числами и буквами.
В первой задаче подразумевается, что такая буква одна. Во второй задаче подразумевается, что такая буква не одна. В третьей задаче подразумевается, что такая буква либо одна, либо не одна. То есть это как 1 & 0, 0 & 1, 1 & 1 - три абсолютно разных выражения. Есть ещё четвёртое выражение 0 & 0, которое вполне подходит под начальную формулировку, так как строка или строки в массиве строк может быть пустой или пустыми. То есть нет ни одной самой встречающейся буквы, ни нескольких.
py.user.nextА как мне поставить задачу очень точно, если в исходном условии не хватает данных?
Поэтому мы ставим задачу очень точно.
py.user.nextНу я готова 3 кода написать.
Ну так вот, вот эти задачи похожи друг на друга, но они разные. И то, что они похожи друг на друга, не значит, что они должны каким-то образом обрабатываться одним чудесным кодом. Это ловушка. Так часто кажется новичкам “ну, не буду же я, как дурак, писать три кода, я напишу один, типа я умный”. И вот так они начинают делать что?
py.user.nextПоняла.
Поэтому мы ставим задачу очень точно. Потом для неё составляем алгоритм очень правильно. И потом для него пишем реализацию в виде кода очень красивого (код должен быть правильным, понятным и легко меняемым). Если задача поставлена, а алгоритм построить не можешь, то не надо строить что-то похожее на этот алгоритм, а потом менять задачу под это что-то похожее. Если алгоритм реализовать не можешь в коде, то не надо писать что-то похожее на реализацию этого кода, а потом алгоритм перестраивать под это что-то похожее.
py.user.nextСпасибо огромное. Сегодня же все сяду и исправлю!
Также по коду комменты:
OceanОчень сложно всё точно описать со всех сторон, поэтому никто задач не выдумывает, а берёт уже готовые задачи из математики, где уже всё точно определено. Поэтому так много математических примеров, которые предлагают решать программно. Их не нужно выдумывать, их не нужно придумывать, их не нужно продумывать. Их придумали уже давным давно, а алгоритмическое мышление они развивают так же. Ну, с мотивацией там не очень прикольно, конечно, потому что их скучно делать, но зато их дофига и в них нет дефицита. Если все их рутинно прорешивать, то навыки мышления алгоритмами встают прочно. А навыки уже потом будут в интересных задачах работать. И поэтому после прорешивания математических программ образные программы решаются удивительно легко.
Поняла. Я прост большинство задач, которые тут в темах пишут, в книгах упоминают, не уверена, что правильно понимаю, что подразумевается. Выглядит неполным условием задачи и хз как с ним быть.
OceanТы знаешь, я тебе скажу так: тренировочные задачи сложные, спору нет, они капец какие сложные и времени на них уходит дохера и больше; но реальные задачи (“задачи дикого мира” или “дикие задачи” я их называю, для которых пишутся “дикие проги”) гораздо сложнее тренировочных. Там нет никаких удобных вещей и там всегда дикий пиздец. Вот просто приходят данные тебе и они нихера не удобные. В учебных задачках - да, данные корректные всегда и всё такое. В диких задачах - дикие данные. Как правило, составлял их и подготавливал какой-нибудь дебил (какой-нибудь малолетний ушлёпок или бывший военный, решивший на ассемблере писать под сраку лет). Этот дебил не рассортировал их, а сбросил всё в один поток; всё это повреждённое, всё это неотформатированное, всё это с ошибками. И представь, к тебе такие данные приходят в какой-то ма-а-аленькой части твоей программы, в каком-то там компоненте-подкомпоненте, который не является ключевым совсем. Но тебе его нужно сделать, иначе вся программа работать без него не будет. Естественно, все эти данные тебе нужно разобрать, раскидать и всё это правильно применить и использовать. Так вот поможет тебе в этом только то, прорешивала ли ты эти десятки тупорылых учебных задач или не прорешивала. Нихера само не будет. Вот оно придёт вот такое и ты с этим будешь сидеть и смотреть на это. А программу-то дальше делать надо.
Я неверно воспринимаю тренировочные задачи, как те, которые я могу решать в будущем, когда надо будет подумать, что программа должна корректно работать/завершаться в случае, если пользователь ей подсунет любые данные.
OceanЭто всегда так. Тебе ещё повезло, что есть API, так как бывает так, что его нужно самому разработать для себя, чтобы всем этим пользоваться удобно и пуленепробиваемо. Ты от всякой херотни защищаешься своими обёртками. Пишешь свои обёртки и на них уже пишешь код, который что-то делает. Вся программа у тебя управляет твоими обёртками. Если какой-то дебил поменял там что-то в системе, ты просто внутри своих обёрток, которые прикреплены к его сфере влияния, меняешь то же самое следом. Вся остальная твоя программа остаётся целостной и стабильной, потому что он на неё не влияет своими умностями.
Например, я тренировалась работать с API на парсинге работного сайта. Вроде как API должно выдавать понятные ответы по некоему шаблону, что в доках определен. А вот хрен там плавал.
OceanЭто приходит с опытом разработки диких программ. Но чтобы до них дойти, нужно разрабатывать тренировочные программы. В диких программах дикие задачи. А дикие задачи практически полностью самому надо придумывать, и надо самому до всего догадываться в них. Так и накапливается этот опыт секретный, где ты видишь всё невидимое, что ему надо, о чём он там забыл упомянуть. Сначала ты разрабатываешь задачу, потом ты разрабатываешь программу для решения этой задачи. Нужно там какие-то вещи делать или не нужно - ты полностью берёшь на себя ответственность за выбранное решение и реализуешь его потом тоже со всей ответственностью. В диком мире никто не будет за тобой сопли подтирать, помогать тебе принимать решение и так далее. Как правило, все с себя отвественность сбрасывают и ищут того, кто это возьмёт на себя. Поэтому это всё придётся делать тебе, даже если заказал это он - крендель какой-нибудь тупой. То есть это надо даже не тебе, а ты берёшь на себя ответственность и выполняешь задачу.
Это как то вообще нихрена не системный подход получается.
Я так понимаю, что только с практикой решения однотипных задач, ко мне придет верное пониманием, что именно подразумевается?
OceanВсе задачи поставлены точно уже. Они могут быть неразрешимими. Другое дело, что человек может тебе какую-то хуйню написать и ты бросишься её решать, а он тебе на решение скажет “а я не это имел в виду, там нужно другое, немножко другое”, ты будешь думать “ну, сука, ну ладно, давай другое посмотрим”. Он поставил тебе другую задачу, а не ту, которую ему надо решить. Для этого ты его переспрашиваешь сначала, всё уточняешь, чтобы не делать всё впустую. А иначе он так будет десять раз писать всякие типа задачи, которые ему надо решить, ты будешь так десять раз их делать, а нужна будет всё равно какая-то одиннадцатая.
А как мне поставить задачу очень точно, если в исходном условии не хватает данных?
Вариант, что приходит на ум: задать вопросы, но в случае книги это нихрена не работает.
OceanОн попросил одну букву ему вернуть. Я ему вернул одну букву. Хотя экземпляр Counter() содержит их все. Я не стал заморачиваться. Он поставил задачу точно.
Вот на примере задачи из этой темы: для меня в процессе решения стало неочевидно что согласно условия, рассматривается только случай, когда в исходных данных только одна буква встречается чаще всех.
Что мне делать в таких случаях? Я должна четко указать, для каких случаев мой код работает, если я вижу неопределенность в условии или постановка задачи не полная или я не догадываюсь, что именно подразумевается?
Или мне анализировать все случаи и решать целую группу задач?
OceanТы не ему пишешь, а пишешь себе. Чтобы самой для себя узнать, а что там скрывается. Ты их берёшь как три разные программы и каждую из них пишешь лучшим для неё способом. Они не получатся одинаковыми, потому что немножко различаются, они могут вообще полностью разными получиться. И вот в этом ключевой момент. Небольшая подгонка задачи в какой-то мелочи может полностью перечеркнуть уже написанный код. И ты начинаешь замечать, что где-то хочется пожертвовать памятью, потому что код неудобным получается, если её экономить. И вот это хочется нужно гасить, нужно бороться с ним. Это вредная хрень. Это вот как раз проявление программы. Программа тебе говорит “я не хочу писаться так, напиши меня попроще, ты сама отдохнёшь и мне приятно будет”, а ты видишь, что это просто непослушная программка пытается тебя наколоть. И ты берёшь её и говоришь “нет, сука! ты будешь память есть минимально! это я решаю, какая ты будешь”. Вот в этом будет успех. Если ты будешь ходить за программками и будешь просить их, чтобы они написались, хлюздопёрить короче, то они будут тебя всегда в тупики заводить. У тебя в итоге ни одной программы не будет, потому что ни одна из них не получится до конца. А когда дело дойдёт до каких-то массивных программ, там даже куски какие-то их получатся не будут. Мелкие кусочки даже будут тебе такое фуфло толкать - “подгони нас туда-то, чтобы мы были поудобнее и тебе хорошо и нам хорошо”. Это всё путь к провалу.
Ну я готова 3 кода написать.
Получается надо просто делать и спрашивать и с опытом пойму, когда нужно “похожие задачи” обрабатывать, а когда это избыточно?
OceanВот это тоже точная постановка задачи
Я тут четко алгоритм строила и писала задачу для случая, когда данные приходят корректные:
- только буквы;
- есть только одна самая часто встречающаяся буква.
- только буквы, цифры, знаки препинания, юникодовые символы;
OceanДа, без точной постановки задачи не стоит начинать её решать. Я сейчас начну решать, а в процессе пойму, что мне надо решить, - это неправильный процесс. Это признак того, что нет задачи. Ну, ты будешь блуждать и всё. Закончишь где-нибудь в полном бардаке. В результате код выкинешь. В худшем случае будешь ещё пропихивать это со словами “да это хороший код, вы просто не понимаете”. Так делают часто всякие ушлепаны великовозрастные. Напишут дерьмо какое-нибудь и пропихивают его всем. В грудь себя колотит “да я! да я программирую двадцать/тридцать/пятьдесят лет! да я знаю, как писать!”.
Получается тупить я начала когда стала думать о проверке правильности кода и только тогда, я додумалась, что мне не всегда может придти на обработку “идеальный” (с точки зрения условий задачи) массив. То есть я уже выполнила все пункты разработки и только потом я подумала, что если бабушка - это дедушка. Поздновато как бы. Ладно тут микрозадачка, а если че-то побольше? Получается из-за того, что я башкой на берегу не подумала, делала полную хрень.
OceanХорошо, да. Но не всегда есть время на тесты. Часто ты разрабатываешь макет, чтобы понять, нужен ли он тебе (какой-то путь, который реализован в этом макете). Если ты будешь писать для него тесты, на это уйдёт время. Бывает много времени уходит. А потом ты его разрабатываешь и на середине понимаешь, что он не нужен тебе. Или там в конце понимаешь, что он не нужен тебе. И вот у тебя тесты есть разработанные, на них время ушло, а они оказались тебе нафиг не нужны. Следовательно, быстрее можно было сделать макет без тестов, увидеть, что он нужен, сделать только тогда тесты и потом этим пользоваться, разрабатывать дальше эту идею итеративно. Или, следовательно, быстрее можно было сделать макет без тестов, увидеть, что он нафиг не нужен, не делать никакие тесты и просто выкинуть этот макет.
Может быть для таких тормозов, как я, стоит добавить еще пару пунктов? Ну, например:
1) ставим задачу очень точно
2) определяем достаточный набор тестов, которые подтвердят, что алгоритм правильно реализован для всех случаев
3) составляем алгоритм очень правильно
4) пишем реализацию в виде кода очень красивого
5) пишем и запускаем красивые тесты красивого кода