Python3 对 dict list 进行排序

Python3 中的排序,在 Sorting HOW TO 中已经讲得很清楚了。来个实际的例子,对下面的这个 list 依据创建时间排序:

 1pages = [
 2{'title': '十年学会程序设计', 'time': '2012-02-14', 'name': '21-days'}, 
 3{'title': 'ANE Toolkit', 'time': '2012-06-07', 'name': 'anetoolkit'}, 
 4{'title': 'cocos2d-x-filters', 'time': '2015-05-06', 'name': 'cocos2d-x-filters'}, 
 5{'title': '我的Firefox插件', 'time': '2006-05-23', 'name': 'firefox-addons'}, 
 6{'title': 'Flash&Flex大全', 'time': '2005-11-02', 'name': 'flashassistant'}, 
 7{'title': '提问的智慧', 'time': '2005-10-08', 'name': 'howtoask'}, 
 8{'title': 'Linux软件', 'time': '2009-04-30', 'name': 'linux-software'}, 
 9{'title': 'Platform ANEs', 'time': '2013-08-22', 'name': 'platform-anes'}, 
10{'title': '阅读', 'time': '2015-03-03', 'name': 'read'}, 
11{'title': 'Sprite Sheet Editor', 'time': '2011-08-18', 'name': 'sprite_sheet_editor'}, 
12{'title': 'SpriteSheetPacker', 'time': '2011-04-19', 'name': 'spritesheetpacker'}, 
13{'title': 'WordPress大全', 'time': '2006-03-07', 'name': 'wordpressfavorite'}, 
14{'title': 'WPCMD', 'time': '2015-06-12', 'name': 'wpcmd'}
15]

首先,排序需要一个可以比较的对象,我使用键名为 index 中的对象:

1from datetime import date
2
3for item in pages:
4	t = item['time'].split('-')
5	item['index'] = date(int(t[0]), int(t[1]), int(t[2]))

date 的实例是可比较的(它实现了 __lt__ 那一套方法), date(2012,2,14) < data(2005, 11, 2) == False

然后,对 pages 调用 sort 方法:

1pages.sort(key=lambda item : item['index'])

在这里,我需要为 key 传递一个函数,这个函数能返回需要比较的值。

当然,也可以使用 operator 提供的 itemgetter 方法来获取这个待比较的值。

1from operator import itemgetter
2names.sort(key=itemgetter('index'))

除了 itemgetter 之外, operator 模块还提供了 attrgettermethodcaller

张贺 对上面提到的 Sorting Mini-HOW TO 做了一些必要的中文评注,该文和 Sorting HOW TO 基本相同。

如果想要再了解一点,可以看这篇 通过某个关键字排序一个字典列表排序不支持原生比较的对象

当然,你最好先把 Sorting HOW TO 看完。

(全文完)