Nano Hash - криптовалюты, майнинг, программирование

Расположите элементы с одинаковым количеством в алфавитном порядке

Метод Python Collection Counter.most_common(n) возвращает первые n элементов с их количеством. Однако, если количество двух элементов одинаково, как я могу вернуть результат, отсортированный по алфавиту?

Например: для строки типа: BBBAAACCD для "2-самых распространенных" элементов я хочу, чтобы результат был для указанного n = 2:

[('A', 3), ('B', 3), ('C', 2)]

и не:

[('B', 3), ('A', 3), ('C', 2)]

Обратите внимание, что хотя A и B имеют одинаковую частоту, A стоит перед B в результирующем списке, так как оно предшествует B в алфавитном порядке.

[('A', 3), ('B', 3), ('C', 2)]

Как я могу этого добиться?


  • Возможный дубликат Как отсортировать счетчик по значению? - питон 18.04.2017
  • @HarshaW нет, это не дубликат. Я только что обновил свой вопрос, чтобы уточнить, чего я пытаюсь достичь. Пожалуйста, просмотрите и дайте мне знать, если у вас есть какие-то мысли. 18.04.2017

Ответы:


1

Хотя этот вопрос уже немного устарел, я хотел бы предложить очень простое решение проблемы, которое просто включает сортировку ввода Counter() перед созданием самого объекта Counter. Если вы затем вызовете most_common(n), вы получите первые n записи, отсортированные в алфавитном порядке.

from collections import Counter

char_counter = Counter(sorted('ccccbbbbdaef'))
for char in char_counter.most_common(3):
  print(*char)

в результате получается:

b 4
c 4
a 1
07.01.2020

2

Здесь есть две проблемы:

  1. Включайте дубликаты при рассмотрении первых n наиболее распространенных значений, за исключением дубликатов.
  2. Для любых дубликатов, заказ в алфавитном порядке.

Ни одно из решений до сих пор не решает первую проблему. Вы можете использовать очередь кучи с itertools unique_everseen рецептом ( также доступны в сторонних библиотеках, таких как toolz.unique) для вычисления n-го по величине числа.

Затем используйте sorted с пользовательским ключом.

from collections import Counter
from heapq import nlargest
from toolz import unique

x = 'BBBAAACCD'

c = Counter(x)
n = 2
nth_largest = nlargest(n, unique(c.values()))[-1]

def sort_key(x):
    return -x[1], x[0]

gen = ((k, v) for k, v in c.items() if v >= nth_largest)
res = sorted(gen, key=sort_key)

[('A', 3), ('B', 3), ('C', 2)]
05.11.2018

3

Я бы сначала отсортировал ваш выходной массив в алфавитном порядке, а затем снова отсортировал по большинству вхождений, которые сохранят алфавитный порядок:

from collections import Counter
alphabetic_sorted = sorted(Counter('BBBAAACCD').most_common(), key=lambda tup: tup[0])
final_sorted = sorted(alphabetic_sorted, key=lambda tup: tup[1], reverse=True)
print(final_sorted[:3])

Выход:

[('A', 3), ('B', 3), ('C', 2)]
13.09.2018
  • это не работает со строкой 'qqweertyuiopasdfghjklzxcvbnm' 25.03.2019
  • Спасибо за ваше замечание. Я изменил решение на более общее, которое решает ваш пример! 24.04.2019

  • 4

    Я бы пошел на:

    sorted(Counter('AAABBBCCD').most_common(), key=lambda t: (-t[1], t[0]))
    

    Это сортирует количество по убыванию (как они уже есть, что должно быть более производительным), а затем сортирует по имени по возрастанию в каждой группе равного количества

    05.11.2018
  • Но это не включает дубликаты, когда пользователю нужны 2 верхних значения, например. см. мой ответ. 05.11.2018
  • О, это не было явно указано в вопросе 05.11.2018
  • Возможно, но это подразумевается в выводе. Я согласен, что вопрос можно было бы написать более четко (я постараюсь это сделать). 05.11.2018

  • 5

    Это одна из проблем, с которыми я столкнулся на экзамене по собеседованию и не справился с ним. Пришел домой, немного поспал, и решение пришло мне в голову.

    from collections import Counter
    
    
    def bags(list):
        cnt = Counter(list)
        print(cnt)
        order = sorted(cnt.most_common(2), key=lambda i:( i[1],i[0]), reverse=True)
        print(order)
        return order[0][0]
    
    
    print(bags(['a','b','c','a','b']))
    
    17.02.2019
  • но если вы будете использовать больше элементов в списке, результат не будет сортироваться по алфавиту, например, попробуйте использовать, print(bags(['a','b','c','a','b', 'c', 'c', 'd', 'd'])) и most_common(3), иногда он возвращает [('c', 3), ('b', 2), ('a', 2)], но я всегда жду [('c', 3), ('a', 2), ('b', 2)] 26.03.2019

  • 6
    s = "BBBAAACCD"    
    p = [(i,s.count(i)) for i in sorted(set(s))]
    

    ** Если вы согласны не использовать счетчик.

    24.04.2019

    7
    from collections import Counter
    
    
    s = 'qqweertyuiopasdfghjklzxcvbnm'
    
    s_list = list(s)
    
    elements = Counter(s_list).most_common()
    
    print(elements)
    alphabet_sort = sorted(elements, key=lambda x: x[0])
    print(alphabet_sort)
    num_sort = sorted(alphabet_sort, key=lambda x: x[1], reverse=True)
    print(num_sort)
    

    если вам нужно получить фрагмент:

    print(num_sort[:3])
    
    25.03.2019

    8
    from collections import Counter
    print(sorted(Counter('AAABBBCCD').most_common(3)))
    

    Этот вопрос кажется дубликатом Как отсортировать счетчик по значению? - питон

    18.04.2017
  • это не работает. Если вы сделаете 'A' не самым распространенным, он отменит most_common и вернет его в алфавитном порядке. 26.09.2017
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..