Подсчет количества непрерывных алфавитов в строке, а затем сортировка по их частоте

Я пытаюсь подсчитать, сколько раз каждая буква повторяется в строке, а затем отсортировать это. Например, скажем, моя строка выглядит так:

AADDADCBBB

Я хочу создать функцию, возвращающую количество раз, которое подряд повторяется каждая буква; в этом случае мы получили бы:

"A: 2, D: 2, A: 1, D: 1, C: 1, B: 3"

Затем я хочу иметь возможность сортировать это на основе:

  • максимальная частота, и
  • в алфавитном порядке

Ожидаемый результат:

"B: 3, A: 2, D: 2, A: 1, C: 1, D: 1"

Как я могу сделать это в Python?


person Community    schedule 06.03.2021    source источник
comment
Похоже, вы определили шаги, теперь просто выполните их.   -  person Manuel    schedule 06.03.2021
comment
Да, но я не знаю, как это сделать, поэтому и спросил.   -  person    schedule 06.03.2021


Ответы (1)


Вы можете использовать itertools.groupby(), чтобы добиться этого следующим образом:

from itertools import groupby
my_str = 'AADDADCBBB'

tup = [(i, len(list(l))) for i, l in groupby(my_str)]

где tup – это список кортежей, содержащих алфавит, и его счетчик выглядит следующим образом:

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

Теперь, чтобы отсортировать этот кортеж на основе количества алфавитов, а затем на основе лексикографического приоритета, вы можете использовать sorted() с ключом lambda x: (-x[1], x[0]).

Здесь -[1] будет сортировать кортеж в порядке убывания значения элемента с индексом 1st. Если это значение одинаково для нескольких кортежей, вторичная сортировка будет выполнена по x[0]. Он будет сортироваться на основе элемента, присутствующего в индексе 0th, в порядке возрастания.

Например:

from operator import itemgetter
sorted_tup = sorted(tup, key=lambda x: (-x[1], x[0]))

где sorted_tup будет содержать значение:

[('B', 3), ('A', 2), ('D', 2), ('A', 1), ('C', 1), ('D', 1)]
person Anonymous    schedule 06.03.2021