Pythonic способ подсчета наиболее частых элементов с дубликатами в счетчике, отдельно по количеству элементов?

Меня интересует аккуратный (+ оптимальный) способ решения следующей проблемы, так как мне любопытно, как выполнить это на языке Python. Выполняя отдельную задачу, я попытался сделать словарь collections.Counter с произвольными элементами:

d = Counter({('A','C'): 4, ('B','D','E'): 3, ..., ('A','G','V','X','Z'): 1, ('L','Z'): 1})

Здесь каждый элемент представляет собой кортеж, состоящий из 2 и более символов. Моя цель — создать список с наиболее часто встречающимися элементами с, дублирующими однозначно по количеству элементов в кортеже. Например, решение может выглядеть следующим образом:

d_sample = Counter({('A', 'C'): 4, ('B', 'D', 'E'): 3, ('A' ,'D'): 3, ('C', 'D', 'E'): 3, 
                    ('A', 'B', 'C', 'D', 'E'): 2, ('A', 'C', 'D', 'E'): 1, 
                    ('B', 'C', 'D', 'E'): 1, ('D', 'E'): 1})

result = [('A', 'C'), ('B', 'D', 'E'), ('C', 'D', 'E'), ('A', 'B', 'C', 'D', 'E'),
         ('A', 'C', 'D', 'E'), ('B', 'C', 'D', 'E')]

Здесь выбран ('A', 'C'), так как это кортеж с двумя элементами с наибольшим количеством. ('B', 'D', 'E') и ('C', 'D', 'E') выбраны, поскольку они представляют собой кортежи с тремя элементами с наибольшим количеством. То же самое касается других элементов в списке result.

Метод, о котором я подумал, заключался в использовании цикла for для извлечения нескольких списков из d, разделенных по количеству элементов: for i in range(2, # maximum elements using another for loop). Оттуда я подсчитал элементы с наибольшей частотой, используя еще один цикл for и max().

# pseudo-example:

maxval = 2

for x in d:
   if len(x[0]) > maxval:
       maxval = len(x[0])

counter_list = [[] * n for n in range(maxval-2)]

for x in d:
   counter_list[len(x[0])-2].append(x)

## selecting max per list

Как уже говорилось, это совсем не похоже на Pythonic и оптимально. Любые идеи для более оптимального выполнения задачи будут оценены.

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

wim 23.04.2022 04:54

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

raven 23.04.2022 05:11
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
2
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это На), и я не думаю, что будет возможно получить асимптотически лучше, чем это.

highest_count_for_length = {}
result = []
for tup, count in d.items():
    try:
        if highest_count_for_length[len(tup)] == count:
            result.append(tup)
    except KeyError:
        # we haven't seen this length yet
        highest_count_for_length[len(tup)] = count
        result.append(tup)

Он полагается на тот факт, что ввод уже упорядочен по значению.

Должен ли он быть упорядочен по возрастанию, а не по убыванию, как в задаче? Я запустил его с моим существующим образцом счетчика, и он возвращает минимальные значения с дубликатами.

raven 23.04.2022 06:01

Данные должны быть упорядочены в порядке убывания, как в примере, показанном в вопросе. Этот код должен дать точно такой же результат, как и в примере.

wim 23.04.2022 21:20

Другие вопросы по теме