【问题标题】:Sort a list of dicts by dict values按字典值对字典列表进行排序
【发布时间】:2011-02-22 02:43:56
【问题描述】:

我有一个字典列表:

[{'title':'New York Times', 'title_url':'New_York_Times','id':4},
 {'title':'USA Today','title_url':'USA_Today','id':6},
 {'title':'Apple News','title_url':'Apple_News','id':2}]

我想按标题排序,所以带 A 的元素排在 Z 之前:

[{'title':'Apple News','title_url':'Apple_News','id':2},
 {'title':'New York Times', 'title_url':'New_York_Times','id':4},
 {'title':'USA Today','title_url':'USA_Today','id':6}]

最好的方法是什么? 另外,有没有办法确保每个字典键的顺序保持不变,例如,总是 title、title_url,然后是 id?

【问题讨论】:

标签: python sorting dictionary


【解决方案1】:
l.sort(key=lambda x:x['title'])

使用多个键进行排序,假设全部按升序排列:

l.sort(key=lambda x:(x['title'], x['title_url'], x['id']))

【讨论】:

  • +1,使用key 并提取正确的属性比仅使用lambda 作为排序函数更正确/更干净
  • 是的,我也记得 - Python 2.4+ 有它们,所以它们可能可用。
【解决方案2】:

当被 lambdas 接近时打喷嚏的人的低过敏性替代品:

import operator
L.sort(key=operator.itemgetter('title','title_url','id'))

【讨论】:

    【解决方案3】:

    在列表上调用.sort(fn),其中fn是一个比较标题值并返回比较结果的函数。

    mylist.sort(lambda x,y: cmp(x['title'], y['title']))
    

    在更高版本的 Python(2.4+)中,最好只使用排序键:

    mylist.sort(key=lambda x:x['title'])
    

    此外,只要没有更多的添加/删除,如果您遍历键/值,字典就可以保证保持顺序。但是,如果您添加或删除项目,则所有赌注都将被取消,因此无法保证。

    【讨论】:

      【解决方案4】:
      originalList.sort(lambda d1, d2: cmp(d1['title'], d2['title']))
      

      虽然这仅按标题和顺序排序,但未定义。这样做会很痛苦。

      【讨论】:

      • cmp 被弃用是有充分理由的,因为key 要好得多。在多个级别上进行排序很容易 - 只需使用元组查看 Kenny 的答案
      • 之后的顺序被定义为它们最初发生的顺序。 (Python 排序是稳定的。)
      猜你喜欢
      • 2010-11-15
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多