Python 按值的升序和键的降序对字典进行排序

Python 按值的升序和键的降序对字典进行排序,python,dictionary,data-structures,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]))) 我希望输出如下所示: [(3101),(4107),(2150),(0150),(1151)] 但结果是:

我试图对一个字典进行排序,我想遵循的顺序是,首先,字典应该按照值的递增顺序进行排序,如果两个或更多键的值相等,那么我想按照键的降序对字典进行排序

代码如下:

dictionary = {0: 150, 1: 151, 2: 150, 3: 101, 4: 107}
print(sorted(dictionary.items(), key=lambda x: (x[1], x[0])))
我希望输出如下所示:
[(3101),(4107),(2150),(0150),(1151)]

但结果是:
[(3,101)、(4,107)、(0,150)、(2,150)、(1,151)]

因为这里的值是数字的,所以可以使用否定与反转排序顺序具有相同的效果:

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)))
从functools导入cmp\u到\u键
def cmp(a、b):
# https://stackoverflow.com/a/22490617/13596037
返回(a>b)-(a
如果这些值是数值,可以使用排序(dictionary.items(),key=lambda x:(-x[1],x[0])如果希望两个值同时按相反方向排序,则必须将其中一个值设为负值。@jornsharp如果两个值都不是数值,请给出一般性建议?(之前我所能想到的就是沿着
cmp1或cmp2
的线条编写一个组合的
cmp
函数,并使用
cmp\u to\u键
)我上面写的与我要求的相反(尽管一般原则成立)-在下面的回答中更正。这里,您使用的是sorted()它以升序作为默认值如果有人有更好的方法来处理一般情况,请您发布一个答案(并让我知道)。这个问题不值得投票吗?(我已经回答了上面的问题。)