【问题标题】:Sorting the content of a dictionary by the value and by the key按值和键对字典的内容进行排序
【发布时间】:2011-08-16 09:27:28
【问题描述】:

按值对字典的内容进行排序已经被详细描述过,因此可以通过以下方式实现:

d={'d':1,'b':2,'c':2,'a':3}
sorted_res_1= sorted(d.items(), key=lambda x: x[1]) 
# or
from operator import itemgetter 
sorted_res_2 = sorted(d.items(), key=itemgetter(1)) 

我的问题是,实现以下输出的最佳方法是什么:

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

如果值相等,则元组先按值排序,然后按键排序。

其次 - 是否可以反转: [('a', 3), ('b', 2), ('c', 2), ('d', 1)] 而不是 [('a', 3), ('c', 2 ), ('b', 2), ('d', 1)]?

【问题讨论】:

    标签: python sorting dictionary


    【解决方案1】:

    sortedkey 参数可以返回一个元组。在这种情况下,元组中的第一个项目用于对项目进行排序,第二个用于打破平局,第三个用于仍然平局的项目,依此类推......

    In [1]: import operator
    
    In [2]: d={'d':1,'b':2,'c':2,'a':3}
    
    In [3]: sorted(d.items(),key=operator.itemgetter(1,0))
    Out[3]: [('d', 1), ('b', 2), ('c', 2), ('a', 3)]
    

    operator.itemgetter(1,0) 返回一个由第二个元素组成的元组,然后是第一个元素。也就是说,如果f=operator.itemgetter(1,0)f(x) 返回(x[1],x[0])

    【讨论】:

    • 注意:itemgetter 有多个项目仅适用于 python >2.5
    • 是否可以将一个排序为正序,第二个反向排序,即[('a', 3), ('b', 2), ('c', 2), ('d ', 1)]?
    • @Damian:您可以通过将整数更改为负数来做到这一点:sorted(d.items(),key=lambda x: (-x[1],x[0]))
    【解决方案2】:

    您只需要标准的tuple 比较,但在反向模式下:

    >>> sorted(d.items(), key=lambda x: x[::-1])
    [('d', 1), ('b', 2), ('c', 2), ('a', 3)]
    

    【讨论】:

      【解决方案3】:

      另一种方法,非常接近您自己的示例:

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

      【讨论】:

        猜你喜欢
        • 2011-07-08
        • 2019-01-25
        • 1970-01-01
        • 2019-06-26
        • 2020-12-10
        • 2021-10-15
        • 1970-01-01
        • 2012-04-12
        • 2016-04-17
        相关资源
        最近更新 更多