【问题标题】:Sorting dictionary keys by value, then those with the same value alphabetically按值对字典键进行排序,然后按字母顺序对具有相同值的键进行排序
【发布时间】:2015-04-06 00:55:52
【问题描述】:

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

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)

【问题讨论】:

标签: python sorting dictionary


【解决方案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)]

【讨论】:

    【解决方案2】:

    在 python 版本 >3.6 中,您可以使用 sorted() 函数对字典进行排序

    内置的 sorted() 函数保证稳定。一个排序是稳定的,如果它保证不改变比较相等的元素的相对顺序

    Refer Python Docs

    【讨论】:

      【解决方案3】:

      我认为你想要:

      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()),然后您的主要排序顺序由元组中的第一个元素(即键)决定,这不是您想要的。诀窍是反转元组,然后按照您的意愿进行比较。

      【讨论】:

      • 你能解释一下区别吗?我真的不是很精通这些功能,“我的”代码是在另一个问题上找到的,当我看到它起作用时就复制了。
      • 您的只是查看元组中索引 1 处的元素(即“值”)。如果两个项目具有相同的值,那么排序算法认为它们是相同的(出于所有意图和目的),并将它们按照它们进入的顺序放入输出中(不管“键”如何)。只有当值相同时,我才会考虑密钥。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2021-12-20
      相关资源
      最近更新 更多