按值排序字典键,然后按字母表顺序排列具有相同值的键

7

我知道标题中没有很好地解释,所以我会在这里尽力做得更好。我想按它们各自的值对字典的键进行排序,然后按字母顺序对具有相同值的任何键进行排序。最好的方法是什么,理想情况下不使用模块?

Python是否会自动执行此类排序:

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

我尝试了上面的代码,它似乎有效,但我不确定这只是巧合还是真正有效。文档中没有找到相关信息,我需要知道它是否总是有效。

起始字典:

dictionary = {'d':2, 'c':1, 'a':2, 'b':3}

按值排序:

['c', 'd', 'a', 'b']

(1, 2, 2, 3)

相同值的项按字母顺序排序:

['c', 'a', 'd', 'b']

(1, 2, 2, 3)


这似乎是多次重复?请查看此答案:https://dev59.com/zVrUa4cB1Zd3GeqPik4g?rq=1 - beroe
4个回答

8
我觉得你想要的是:

我认为您想要:

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

这与以下代码等效:

def reverse_tuple(t):
    return t[::-1]

sorted(dictionary.items(), key=reverse_tuple)

这是可行的,因为元组按字典序排序。首先比较第一个元素,如果相等,则Python继续比较第二个元素,以此类推。
这与sorted(dictionary.items())几乎一样,但不幸的是,你的主要排序顺序由元组中的第一个元素(即键)决定,这不是你想要的。诀窍是反转元组,然后进行比较,这样比较就能按你想要的方式工作了。

你能解释一下它们的区别吗?我对这些函数并不是很熟悉,“我的”代码是在另一个问题上找到的,当我看到它可以工作时就复制了。 - CharlieDeBeadle
1
你的程序只是查看元组中索引为1(即“值”)的元素。如果两个项目具有相等的值,则排序算法认为它们相同(就所有目的而言),并按照它们输入的顺序(不考虑“键”)将它们放入输出中。我的程序仅在值相同时才考虑键。 - mgilson

1
这将起到作用:
sorted(dic.items(),key= lambda  x: (x[1],x[0]))

它将根据字典的第二个元素(值)进行升序排序。如果字典的值相等,则会比较第一个元素并按字母顺序对它们进行排序。以下是更好的示例:

dic = {'abc':3, 'x':1, 'bcc':4, 'a':6 , 'bba':4  , 'bg':4 }

排序:

[('x', 1), ('abc', 3), ('bba', 4), ('bcc', 4), ('bg', 4), ('a', 6)]

0
在Python版本大于3.6中,您可以使用sorted()函数对字典进行排序。
内置的sorted()函数保证是稳定的。如果一个排序是稳定的,那么它保证不会改变相等元素之间的相对顺序。 请参阅Python文档

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

上面的答案适用于以下测试用例

开始字典:

dictionary = {'d':2, 'c':1, 'a':2, 'b':3}

按值排序:

['c', 'd', 'a', 'b']
(1, 2, 2, 3)

按照字母顺序排序的具有相同值的项目:

['c', 'a', 'd', 'b']
(1, 2, 2, 3)

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