【问题标题】:In Python how do I sort a list of dictionaries by a certain value of the dictionary + alphabetically?在 Python 中,如何按字典的某个值 + 按字母顺序对字典列表进行排序?
【发布时间】:2010-10-28 06:42:30
【问题描述】:

好的,这就是我想要做的......我知道 itemgetter() 排序可以很容易地按字母排序,但是如果我有这样的事情:

[{'姓名':'总计', '排名':100}, {'Name':'Woo Company', 'Rank':15}, {'Name':'ABC Company', 'Rank':20}]

我希望它按字母顺序排序(按名称)+ 包括名称:'TOTAL' 的条件应在序列中最后列出,如下所示:

[{'姓名':'ABC公司', '排名':20}, {'Name':'Woo Company', 'Rank':15}, {'Name':'TOTAL', 'Rank':100}]

我该怎么做?

【问题讨论】:

    标签: python list sorting dictionary


    【解决方案1】:

    这里最好的方法是装饰排序键... Python 将按元组组件按顺序对元组进行排序,因此请根据您的排序条件构建一个元组键:

    sorted(list_of_dicts, key=lambda d: (d['Name'] == 'TOTAL', d['Name'].lower()))
    

    这会产生一个排序键:

    • (True, 'total') for {'Name': 'TOTAL', 'Rank': 100}
    • (False, 'woo company') for {'Name': 'Woo Company', 'Rank': 15}
    • (False, 'abc company') for {'Name': 'ABC Company', 'Rank': 20}

    由于 False 比 True 更早排序,所以名称不是 TOTAL 的那些将最终放在一起,然后按字母顺序排序,TOTAL 将在最后。

    【讨论】:

    • 哇,这很漂亮...我喜欢这样,因为它不需要在 sorted() 声明之外创建自定义排序算法。谢谢!
    【解决方案2】:
    >>> lst = [{'Name':'TOTAL', 'Rank':100}, {'Name':'Woo Company', 'Rank':15}, {'Name':'ABC Company', 'Rank':20}]
    >>> lst.sort(key=lambda d: (d['Name']=='TOTAL',d['Name'].lower()))
    >>> print lst
    [{'Name': 'ABC Company', 'Rank': 20}, {'Name': 'Woo Company', 'Rank': 15}, {'Name': 'TOTAL', 'Rank': 100}]
    

    【讨论】:

      【解决方案3】:

      使用sort或sorted的key参数。

      例如:

      dicts = [
           {'Name':'TOTAL', 'Rank':100}, 
           {'Name':'Woo Company', 'Rank':15},
           {'Name':'ABC Company', 'Rank':20}
      ]
      
      def total_last(d):
          if d['Name'] == 'TOTAL':
              return '\xff\xff\xff\xff\xff\xff'
          return d['Name'].lower()
      
      import pprint
      pprint.pprint(sorted(dicts, key = total_last))
      
      >python sort_dict.py
      [{'Name': 'ABC Company', 'Rank': 20},
       {'Name': 'Woo Company', 'Rank': 15},
       {'Name': 'TOTAL', 'Rank': 100}]
      

      【讨论】:

      • +1:非常清晰,没有 lambda。但是,“sort_key”是一个不明智的名称选择。 total_last 可能是键功能更具描述性的名称。
      • 按您希望排在最后的任意值进行排序根本不是一个好主意。
      【解决方案4】:

      好吧,我会使用列表的排序方法对它进行多次排序。

      list = [{'Name':'TOTAL', 'Rank':100}, {'Name':'Woo Company', 'Rank':15}, {'Name':'ABC Company', 'Rank':20}]
      
      list.sort(key = lambda x: x['Name']) # Sorted by Name, alphabetically
      
      list.sort(key = lambda x: 'b' if x['Name'] == 'TOTAL' else 'a')
      

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 2014-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        相关资源
        最近更新 更多