按照字典值对字典列表进行排序

17

我有一个字典列表:

[{'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}]

如何最好地实现这个?此外,是否有一种方法可以确保每个字典键的顺序保持不变,例如总是按照标题、标题URL,然后是ID的顺序?


我可以问一下你为什么需要一个排序字典吗?通常你是通过键来访问字典的,所以顺序并不重要。 - Felix Kling
4
好的,这是一个字典列表,Felix。 - Amber
@Amber:是的,我明白了...但无论如何,他的第二个问题是针对这个的 ;) - Felix Kling
4个回答

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

要使用多个键进行排序,假设所有的键都是按升序排列的:

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

2
使用 key 并提取正确的属性比仅使用 lambda 作为排序函数更加正确/更干净。+1 - Daniel DiPaolo
2
是的,我也记得 - Python 2.4+有它们,所以它们可能可用。 - Amber

19

对于那些接近Lambda表达式就会打喷嚏的人来说,这是一种无过敏反应的替代品:

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

2
在列表上调用.sort(fn)方法,其中fn是一个比较标题值并返回比较结果的函数。
mylist.sort(lambda x,y: cmp(x['title'], y['title']))

在Python的后续版本中(2.4+),最好只使用排序键来进行排序:
mylist.sort(key=lambda x:x['title'])

此外,字典保证在遍历键/值时保持其顺序,只要没有更多的添加/删除。但是,如果您添加或删除项目,则所有赌注都将关闭,无法保证顺序。


-1
originalList.sort(lambda d1, d2: cmp(d1['title'], d2['title']))

虽然这只是按标题和顺序排序,但之后的定义是不确定的。用这种方式进行多级排序将会很痛苦。


2
cmp被弃用是有充分理由的,因为key更好。在多个级别上进行排序很容易 - 只需使用元组,参见Kenny的答案。 - John La Rooy
1
之后的顺序定义为它们最初发生的顺序。(Python排序是稳定的。) - Mike Graham

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