Подтвердить что ты не робот

Сортировка словаря по значению, затем по ключу

Кажется, что это должно быть обманом, но мой SO-search-fu сегодня плохой...

Скажем, у меня есть словарь целочисленного ключа/значений, как я могу сортировать словарь по значениям, по убыванию, затем по убыванию имени (для общих значений).

Input:

{12:2, 9:1,  14:2}
{100:1, 90:4, 99:3, 92:1, 101:1}

Вывод:

[(14,2), (12,2), (9,1)]  # output from print 
[(90,4), (99,3), (101,1), (100,1), (92,1)]
4b9b3361

Ответ 1

In [62]: y={100:1, 90:4, 99:3, 92:1, 101:1}
In [63]: sorted(y.items(), key=lambda x: (x[1],x[0]), reverse=True)
Out[63]: [(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)]

key=lambda x: (x[1],x[0]) сообщает sorted, что для каждого элемента x в y.items() используйте (x[1],x[0]) в качестве значения прокси для сортировки. Так как x имеет вид (key,value), (x[1],x[0]) дает (value,key). Это приводит к тому, что sorted сначала сортируется по value, затем key для тай-брейков.

reverse=True сообщает sorted представить результат в порядке убывания, а не в порядке возрастания.

См. эту страницу wiki page для большого учебника по сортировке на Python.

PS. Я попытался использовать key=reversed вместо этого, но reversed(x) возвращает итератор, который не сравнивается по мере необходимости здесь.

Ответ 2

Возможно, это более явное:

>>> y = {100:1, 90:4, 99:3, 92:1, 101:1}
>>> reverse_comparison = lambda (a1, a2), (b1, b2):cmp((b2, b1), (a2, a1))
>>> sorted(y.items(), cmp=reverse_comparison)
[(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)]

Ответ 3

Попробуйте следующее:

>>> d={100:1, 90:4, 99:3, 92:1, 101:1}
>>> sorted(d.items(), lambda a,b:b[1]-a[1] or a[0]-b[0])