繁体   English   中英

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

[英]Sorting a dictionary by its value, and then its key if values are equal then outputting a list

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

在我的回答中,我用dct替换了map以不掩盖内置函数。

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

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

在Python中保证排序是稳定的,所以你要做的就是排序两次:首先是键,然后是值。

sorted_pairs = sorted(sorted(map.iteritems()), key=operator.itemgetter(1), reverse=True)

要从此输出中获取密钥,您可以使用列表解析:

[k for k,v in sorted_pairs]

PS不会将您的变量命名为与Python类型相同,否则您有一天会感到非常惊讶。

假设你有一个列表如下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM