我有一本字典,内容如下:
dict = {'P1' :361 , 'P2' : 361, 'P3' : 391, 'P6' : 361, 'P4':361, 'P5' :361}
需要根据值降序排序。对于任何给定的项目,如果值与其比较的项目相同,则将按键的升序排序。因此,dict 的结果值应该是这样的。
{'P3' : 391 , 'P1' : 361, 'P2': 361, 'P4': 361, 'P5': 361,'P6' : 361}
我已经用这个实现了第一部分:
sorted_dict = OrderedDict(sorted(dict.items(), key=lambda t: t[1],reverse=True))
但是,我不确定如何超越它。我假设比较器函数通常是这样的
def comparator(item1,item2):
if item1.value() == item2.value():
if item1.key()<item2.key():
return -1
if item1.key()>item2.key():
return 1
if item1.key() == item2.key():
return 0
if item1.value() < item2.value():
return -1
if item1.value() > item2.value():
return 1
我不确定如何实现它。请原谅我的天真,我是 Python 的初学者,对该语言的编程结构知之甚少。
最佳答案
您可以使用稍微不同的 lambda 表达式作为排序键。
sorted_dict = OrderedDict(sorted(dict.items(), key=lambda x: (-x[1], x[0])))
输出:
OrderedDict([('P3', 391), ('P1', 361), ('P2', 361), ('P4', 361), ('P5', 361), ('P6', 361)])
提供一个 key
就是提供一个在比较之前转换每个项目的函数。所以在这里,匿名 lambda 函数提供了一个用于排序的序列转换——序列通过依次比较每个元素来排序。因此,我们按数字的负数排序(反转自然升序 -> 降序),如果比较相等,我们继续对字符串进行排序,它通常按您希望的方式排序(至少提供的 sample )。您可能需要使用 string natural sorting对于字符串中较大的数字,如果字典排序不会给您预期的结果。
关于Python:在 OrderedDict 中使用自定义比较器进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032827/