У меня есть Counter
в Python 3.3.x
, который я хочу сортировать.
Я знаю, что могу использовать .most_common(x)
, но я хочу, чтобы ключи сортировались в алфавитном порядке в случае одинакового значения.
Есть ли способ, которым я могу это сделать? Настройка этого типа "выключателя связи"?
Сортировка коллекции счетчиков в python со вторичным термином (таймер)
Ответ 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]
в этом точном порядке.