map={"a":5, "b":2, "c":7, "d":5, "e":5}
输出应该是:
['c', 'a', 'd', 'e', 'b']
因此,代码应该首先按字符的值按降序排列字典,然后如果它的值相同,它应按键按升序排序。到目前为止,我有......
newmap=map
newmap=sorted(newmap.iteritems(), key=operator.itemgetter(1,0),reverse=True)
print newmap
这给了我输出[('c', 7), ('e', 5), ('d', 5), ('a', 5), ('b', 2)]
。所以,我需要按升序获得e,d,a ...而不会弄乱各种数字。我该怎么做?
答案 0 :(得分:5)
在我的回答中,我将map
替换为dct
,以掩盖内置函数。
按逆值对键进行排序,然后按键按升序排序:
sorted(dct, key=lambda k: (-dct[k], k))
通过将值转换为负数,可以反向排序值,而键则按升序排序。
演示:
>>> dct = {'a': 5, 'c': 7, 'b': 2, 'e': 5, 'd': 5}
>>> sorted(dct, key=lambda k: (-dct[k], k))
['c', 'a', 'd', 'e', 'b']
时间比较:
>>> 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
答案 1 :(得分:4)
在Python中保证排序是稳定的,所以你要做的就是排序两次:首先是键,然后是值。
sorted_pairs = sorted(sorted(map.iteritems()), key=operator.itemgetter(1), reverse=True)
要从此输出中获取密钥,您可以使用列表解析:
[k for k,v in sorted_pairs]
P.S。不要将你的变量命名为与Python类型相同,否则你有一天会感到非常惊讶。
答案 2 :(得分:0)
假设您有一个列表:
l = [('a', 1), ('c', 1), ('b', 1), ('aa', 2), ('aa', 3), ('aa', 1)]
案例1:预期:值最低,然后是相同值,按升序排列。
<强>思想:强> 以数字优先的方式组合键值,然后键。
>>> sorted(l, key=lambda y: str(y[1])+y[0])
[('a', 1), ('aa', 1), ('b', 1), ('c', 1), ('aa', 2), ('aa', 3)]
案例2:预期:首先显示的最高值。如果某个键具有相同的值,则按字母表的升序排序。
>>> sorted(l, key=lambda y: str(10-y[1]) + y[0])
[('aa', 3), ('aa', 2), ('a', 1), ('aa', 1), ('b', 1), ('c', 1)]