![](/img/trans.png)
[英]Printing the values of a dictionary when its key is equal to the value of a list element
[英]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.