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

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

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

Входные данные:

{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)] 

 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]) сообщает, что для каждого элемента x в y.items() используйте (x[1],x[0]) в качестве значения прокси для сортировки , Так как x имеет вид (key,value) , (x[1],x[0]) дает (value,key) . В результате sorted сортируется по value сначала, затем по key для тай-брейков.

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

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

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

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

 >>> 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)] 

Попробуй это:

 >>> 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])