按值升序和按键降序对字典排序

时间:2020-08-21 06:57:04

标签: python dictionary data-structures

我正在尝试对字典进行排序,我要遵循的顺序是,首先,字典应该按值以升序排序,如果两个或多个键的值相等,那么我想对字典进行排序按按键降序。

代码如下:

dictionary = {0: 150, 1: 151, 2: 150, 3: 101, 4: 107}
print(sorted(dictionary.items(), key=lambda x: (x[1], x[0])))

我希望输出如下: [(3, 101), (4, 107), (2, 150), (0, 150), (1, 151)]

但是输出是: [(3, 101), (4, 107), (0, 150), (2, 150), (1, 151)]

1 个答案:

答案 0 :(得分:1)

由于此处的值是数字,因此可以使用取反与反转排序顺序具有相同的作用:

sorted(dictionary.items(), key=lambda x: (x[1], -x[0]))

对于更通用的情况,您不能依赖于数字值,这是一种可能的方法,尽管可能有更好的方法。

from functools import cmp_to_key

def cmp(a, b):
    # https://stackoverflow.com/a/22490617/13596037
    return (a > b) - (a < b)

def cmp_items(a, b):
    """
    compare by second item forward, or if they are the same then use first item
    in reverse direction (returns -1/0/1)
    """
    return cmp(a[1], b[1]) or cmp(b[0], a[0])

dictionary = {0: 150, 1: 151, 2: 150, 3: 101, 4: 107}

print(sorted(dictionary.items(), key=cmp_to_key(cmp_items)))