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

时间:2013-11-26 22:12:56

标签: python sorting

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 ...而不会弄乱各种数字。我该怎么做?

3 个答案:

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