Говнокод: по колено в коде.
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
Python / Говнокод #4317
−94
# -*- coding: utf-8 -*- # На входе: не пустой b-массив # На выходе: словарь из 1-ого элемента # 1. Сначала составляем словарь, потом ищем максимум и возвращаем def Freq1(b): assert len(b) > 0 d = <> for x in b: # Пробегаем в цикле исходный массив d[x] = d[x] + 1 if d.has_key(x) else 1 # Если ключ уже есть, прибавляем 1, если нет, записываем 1 v = max(d, key=d.get) # v ключ из словаря соответствующий максимальному значению return # Возвращаем ответ # 2. Ищем максимум прямо при составлении словаря def Freq2(b): d = <> m, i = 0, 0 # Максимальная частота и индекс в словаре for x in b: # Пробегаем в цикле исходный массив d[x] = d[x] + 1 if d.has_key(x) else 1 # Если ключ уже есть, прибавляем 1, если нет, записываем 1 if d[x] > m: m, i = d[x], x # Запоминаем максимум и его индекс return # 3. Без использования словаря (сложность квадратичная - "тупой метод") def Freq3(b): m, i = 0, 0 # Максимальная частота и соответствующее ему значение for x in b: c = b.count(x) # Сколько раз встречается x в массиве b? if c > m: m, i = c, x return # Проверка (примитивный unit-тест) def Check(inData, expected): assert Freq1(inData) == expected assert Freq2(inData) == expected assert Freq3(inData) == expected Check(["banana", "banana", "apple", "banana", "banana", "apple", "onion"], ) Check([2, 3, 9, 3, 6, 6], ) Check([True, True, True, False, False, True], )
Самый часто встречающийся элемент в массиве (3 способа).
Везде сплошной говнокод. Как ПРАВИЛЬНО найти самый часто встречающийся элемент в массиве?
Наверное, можно ещё отсортировать массив и пробежать по нему храня текущий элемент и количество и обновляя соответствующие переменные?
Запостил: denis, 09 Октября 2010
Комментарии (15) RSS
Мистер Хэнки 09.10.2010 12:44 # +1
1й вариант со словарём самый оптимальный, если у вас нет ограничений на использование памяти и т.д.
>>Наверное, можно ещё отсортировать массив и пробежать по нему храня текущий элемент и количество и обновляя соответствующие переменные?
сортировка требует времени
denis 09.10.2010 14:47 # −2
Просто мне кажется, что я считаю зачем-то количество всех элементов. Может можно как-то отсекать редко встречающиеся элементы.
Например, строить сбалансированное бинарное дерево прямо при проходе массива, в узлах будет значение:количество?
У меня плохо с алгоритмами 🙂
Мистер Хэнки 09.10.2010 16:53 # +1
>Например, строить сбалансированное бинарное дерево прямо при проходе массива, в узлах будет значение:количество?
зачем переусложнять? «За деревьями леса не видно» ©
вам надо задачу решить или на девушку произвести впечатление уровнем владения алгоритмами и технологиями? так вроде как не этим впечатляют испокон веку 🙂
xXx_totalwar 09.10.2010 17:00 # 0
>вам надо задачу решить или на девушку произвести впечатление уровнем владения алгоритмами и технологиями? так вроде как не этим впечатляют испокон веку 🙂
во-во поэтому советую ебануть теоркатом: катаморфизмы, анаморфизмы, хиломорфизмы, параморфизмы наконец.
denis 09.10.2010 17:02 # 0
Мне нужно написать самое простое решение задачи, которое удовлетворило бы её препода.
В прошлый раз в задаче поиска элемента и вставки в массив её препод сказал, что бинарный поиск ещё кое-как подходит 🙂
Я написал 5 вариантов: http://stden.livejournal.com/397391.html
roman-kashitsyn 30.06.2015 12:05 # 0
Вставку в отсортированный сырой массив без разницы как делать, ибо эта операция обречена на O(N) независимо от алгоритма. Если вообще такое понадобилось делать — значит
1) массив совсем небольшой, и проще и быстрее всего прогнать итерацию insertion sort.
2) структура данных выбрана неверно, и нужно её менять целиком; например, использовать сортированный multiset.
denis 09.10.2010 14:47 # 0
Также, может есть встроенная функция чтобы это сделать?
telnet 09.10.2010 12:45 # 0
Сессия ж нескоро, неужто уже с курсачами зажимают?
denis 09.10.2010 14:49 # 0
Да, это я помогаю знакомой девушке. Просто я ей пишу как бы я сделал (я сам только начинаю программировать на Python) и мне постоянно кажется, что мои решения не python’овские. В Java я себя чувствую намного уверенней. Я привык копаться в больших Java-проектах и уже примерно знаю что там и как делается.
telnet 09.10.2010 16:25 # +2
Тематика сайта — смехотворный код, а не взаимная помощь и не pastebin. Чтобы это понять, не нужно знание Python’а, нужно знание русского, чтобы прочитать, что написано в шапке страницы, и логика, чтобы, просмотрев хотя бы несколько страниц, убедиться в справедливости написанного. Я не модератор, чтобы указывать, да. Тут вообще модераторов нет. Но Вы не первый, кто приходит сюда за помощью, и смотреть на оффтопик лично я уже подустал. Без обид. Найдёте кусок идиотского кода на той же Jav’е — постите сюда, посмеёмся вместе, опять же.
denis 09.10.2010 14:51 # 0
Например, я почти не использую генераторы и лямбда-выражения, потому что ещё просто не чувствую когда их правильно применять (т.е. есть некоторые очевидные случаи — генерация последовательности с заданными свойствами, это понятно), а вот общее правило??
intestinalbrain 30.06.2015 11:50 # +1
from collections import Counter
dict((Counter(b).most_common()[0],))
3_14dar 30.06.2015 12:22 # 0
roman-kashitsyn 30.06.2015 12:21 # 0
> Как ПРАВИЛЬНО найти самый часто встречающийся элемент в массиве?
Если это лаба, то пофигу, лишь бы не квадратично.
Если бы это нужно сделать один раз в реальной жизни, я бы сделал так:
1) строим хэш таблицу со счётчиками за амортизированное O(N)
2) преобразуем её в массив пар за O(N)
3) строим max heap по частотам за O(log N)
4) вершина хипа — ответ за O(1)
Такой алгоритм работает за амортизированное O(N). Я почти уверен, что питоний Counter, упомянутый выше, примерно так и работает.
Если операция частая и/или может затрагивать подмассивы, гуглите Range Mode Query.
Вывести на экран наиболее часто встречающиеся элементы списка, а также количество

Имеется список людей в формате [Иванов Иван Иванович,
Петров Петр Петрович] , состоящий из 10 элементов. Вывести
на экран наиболее часто встречающиеся Имя и Фамилию, а
также количество.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Найти наиболее часто встречающуюся букву и также вывести на экран в отдельной строке
Помогите с прогой. : В произвольном тексте (взятом из файла), содержащем не более 10 строк, в.

Посчитать все элементы и наиболее часто встречающиеся — удалить
Помогите пожалуйста! Используя класс list (либо map) из стандартной библиотеки шаблонов Stl.
ввести строку с клавиатуры и вывести наиболее часто встречающиеся слова в строке
Помогите пожалуйста с заданием: требуется ввести строку с клавиатуры и вывести наиболее часто.
Определить наиболее часто встречающиеся в файле слова и вывести первые N слов
Во общем, нужно определить наиболее часто встречающиеся в файле слова и вывести первые N слов на.
Регистрация: 13.05.2020
Сообщений: 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
list_fio = ['Иванов Иван Иванович', 'Петров Петр Петрович', 'Петров Андрей Викторович', 'Пупкин Василий Петрович', 'Петров Владимир Игоревич', 'Путин Владимир Владимирович'] list2 = [] names = [] fams = [] for fio in list_fio: list2.append(fio.split()) for i in range(0, len(list_fio)): fams.append(list2[i][0]) names.append(list2[i][1]) count_n = {names.count(n): n for n in set(names)} count_f = {fams.count(f): f for f in set(fams)} print('Наиболее часто встречается фамилия', count_f[max(count_f.keys())], max(count_f.keys()), 'раз' ) print('Наиболее часто встречается имя', count_n[max(count_n.keys())], max(count_n.keys()), 'раз' )
Подсчет наиболее часто встречающихся элементов в итерируемом объекте
Инструмент Counter из модуля collections очень полезен. В частности, с его помощью можно узнать, какие элементы списка или, скажем, какие символы в строке встречаются чаще всего, и сколько раз.
>>> import collections >>> c = collections.Counter('helloworld') >>> c Counter() >>> c.most_common(3) [('l', 3), ('o', 2), ('e', 1)]
Три наиболее часто встречающихся буквы в строке helloworld — l (3 раза), o (2 раза) и e (1 раз).
Поиск самого частого символа
Дана строка str . Необходимо написать функцию, которая принимает на вход строку и выводит кортеж из двух элементов:
- Самый часто встречающийся символ
- Количество его повторов
Примечание 1: Если несколько символов встречаются одинаковое количество раз, то вывести любой из кортежей.
Примечание 2: Пробел и знаки препинания тоже считаются символами.
**Дано:** str = 'hello world' **Результат:** ('l', 3)
**Дано:** 'aaa bbb cc' **Результат:** ('a', 3)