按字典对字典进行排序,然后在值相等的情况下对其键进行排序,然后输出列表

use*_*615 3 python sorting

map={"a":5, "b":2, "c":7, "d":5, "e":5}
Run Code Online (Sandbox Code Playgroud)

输出应该是:

['c', 'a', 'd', 'e', 'b']
Run Code Online (Sandbox Code Playgroud)

因此,代码应首先按其值按降序排列字典,然后如果其值相同,则应按键按升序排序.到目前为止我有......

newmap=map
newmap=sorted(newmap.iteritems(), key=operator.itemgetter(1,0),reverse=True)
print newmap
Run Code Online (Sandbox Code Playgroud)

这给了我输出[('c', 7), ('e', 5), ('d', 5), ('a', 5), ('b', 2)].所以,我需要按升序获得e,d,a ...而不会弄乱各种数字.我该怎么做呢?

Mar*_*ers 5

在我的回答,我换成map用dct不掩盖内置功能.

按逆值对键进行排序,然后按键按升序排序:

sorted(dct, key=lambda k: (-dct[k], k))
Run Code Online (Sandbox Code Playgroud)

通过将值转换为负数,可以反向对值进行排序,而按键按升序排序.

演示:

>>> dct = {'a': 5, 'c': 7, 'b': 2, 'e': 5, 'd': 5}
>>> sorted(dct, key=lambda k: (-dct[k], k))
['c', 'a', 'd', 'e', 'b']
Run Code Online (Sandbox Code Playgroud)

时间比较:

>>> import timeit
>>> timeit.timeit("sorted(dct, key=lambda k: (-dct[k], k))", 'from __main__ import dct')
4.741436004638672
>>> timeit.timeit("map(operator.itemgetter(0), sorted(dct.items(), key=lambda i: (-i[1], i[0])))", 'from __main__ import dct; import operator')
7.489126920700073
>>> timeit.timeit("map(operator.itemgetter(0), sorted(sorted(dct.iteritems()), key=operator.itemgetter(1), reverse=True))", 'from __main__ import dct; import operator')
10.01669192314148
Run Code Online (Sandbox Code Playgroud)