按多个值对字典进行排序

23
我有一个字典 {'Bill': 4, 'Alex': 4, 'Bob': 3, "Charles": 7},需要先按数字大小排序,之后在相同数字的基础上按字母表顺序排列。如果两个项目具有相同的数字键,则它们需要按字母表顺序排序。我尝试过使用 lambda、列表推导等方法,但好像无法正确排序。排序结果应为 Bob, Alex, Bill, Charles
2个回答

44

使用带有键函数的sorted(首先按值(d[k])排序,然后是键k):

>>> d = {'Bill': 4, 'Alex' : 4, 'Bob' : 3, "Charles": 7}    
>>> sorted(d, key=lambda k: (d[k], k))
['Bob', 'Alex', 'Bill', 'Charles']

2
我该如何让一个值降序排列,另一个值升序排列? - Alex Stewart
7
对于数值型,您可以使用取反符号(-)来控制降序。对于非数值型,您应该定义一个子类,并定义 __lt__ 方法。 - falsetru
@AlexStewart,你也可以考虑相反的方法。保持连续值为正,然后将reverse=True放入sorted方法中。sorted(d, key=lambda k: (k[1], k[0]), reverse=True) - Kemal Toprak Uçar

10

使用 sorted() 对字典的项目(元组)进行排序。您可以指定排序键,该键将按照字典的值,然后按其键进行排序:

>>> d = {'Bill': 4, 'Alex' : 4, 'Bob' : 3, "Charles": 7}
>>> sorted(d.items(), key=lambda x:(x[1],x[0]))
[('Bob', 3), ('Alex', 4), ('Bill', 4), ('Charles', 7)]
>>> [t[0] for t in sorted(d.items(), key=lambda x:(x[1],x[0]))]
['Bob', 'Alex', 'Bill', 'Charles']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接