Сортировка коллекции счетчиков в python со вторичным термином (таймер)

У меня есть Counter в Python 3.3.x, который я хочу сортировать.
Я знаю, что могу использовать .most_common(x), но я хочу, чтобы ключи сортировались в алфавитном порядке в случае одинакового значения.
Есть ли способ, которым я могу это сделать? Настройка этого типа "выключателя связи"?

Ответ 1

collections.Counter - фактически словарь, и они полагаются на технологию хеширования, поэтому мы действительно не можем получить к ним доступ по заказу. Поскольку доступ по заказу невозможен, сортировка словаря не может быть и речи. Но вы можете преобразовать это в список кортежей, которые соответствуют ключу и значению, а затем сортируют. Например,

print(Counter('abracadabra').most_common())
# [('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
print(sorted(Counter('abracadabra').most_common(), key=lambda x: (-x[1], x[0])))
# [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)]

Мы делаем sorted сортируем данные (key, value), заданные most_common. Мы хотим убедиться, что элементы должны быть отсортированы по убыванию value и по возрастанию на key. Итак, мы используем здесь небольшой трюк. sorted вызовет функцию, которую мы передаем как значение для параметра key, для каждого из элементов в последовательности, подлежащей сортировке. Значение, возвращаемое этой функцией, будет использоваться для представления этого конкретного элемента во время сравнения с другими элементами. В нашем случае функция key выглядит следующим образом:

lambda x: (-x[1], x[0])

Здесь x в конечном итоге получит все элементы, и он меняет положение первого и второго элементов и отрицает фактическую часть счета. Поскольку sorted по умолчанию сортирует данные в порядке возрастания, мы делаем наибольшее число наименьшим и наоборот. Например,

[2, 3, 1]

Если вы хотите отсортировать их в порядке возрастания, sorted будет хранить наименьший элемент в начале и следующем наименьшем во втором положении и так далее, пока он не достигнет самого большого элемента. В нашем случае он становится [1, 2, 3]. Чтобы отсортировать элементы в порядке убывания, мы делаем их отрицательные значения, представляющие фактические числа.

sorted([2, 3, 1], key=lambda x: -x)

Теперь, когда sorted выбирает 2, он вызывает функцию key, чтобы получить значение, которое будет использоваться, и оно вернет -2, и таким же образом 1 будет -1, 3 будет -3. Он будет размещать элемент с наименьшим в начале. Поскольку мы получили -3 для 3, 3 будет в начале, 2 будет рядом с ним, а 1 будет после него. Таким образом, результат становится [3, 2, 1].

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

Ответ 2

Проблема сортировки по нескольким параметрам (и разным порядкам) в случае разрывов связей может быть решена с помощью sorted() и лямбда-функции, примененной к параметру "keys".

result=sorted(result,key=lambda x: (-x[2],x[0],x[1]))

Знак '-' для x[2] подразумевает, что сортировка должна выполняться сначала в порядке убывания 3-го элемента "result". x[0], x[1] далее указывает, что связи должны быть разорваны в порядке возрастания x[0] и x[1] в этом точном порядке.