Самый питонический способ сделать это - узнать немного больше о реальных данных, в частности, о максимальном значении, которое вы можете иметь, а затем сделать это так:
def sortkey((k, v)):
return (maxval - v, k)
items = thedict.items()
items.sort(key=sortkey)
, но если вы уже не знаете максимальное значение, поиск максимального значения означает циклическое прохождение через dict дополнительное время (с max(thedict.itervalues())
), которое может быть дорогим. Кроме того, ключевая версия решения S.Lott:
def sortkey((k, v)):
return (-v, k)
items = thedict.items()
items.sort(key=sortkey)
Альтернативой, которая не заботится о типах, будет функция сравнения:
def sortcmp((ak, av), (bk, bv)):
# compare values 'in reverse'
r = cmp(bv, av)
if not r:
# and then keys normally
r = cmp(ak, bk)
return r
items = thedict.items()
items.sort(cmp=sortcmp)
и это решение фактически работает для любого типа ключа и значения, с которым вы хотите смешать сортировку по возрастанию и убыванию в одном ключе. Если вы цените краткость, вы можете написать sortcmp как:
def sortcmp((ak, av), (bk, bv)):
return cmp((bk, av), (ak, bv))