Python3 中的排序,在 Sorting HOW TO 中已经讲得很清楚了。来个实际的例子,对下面的这个 list 依据创建时间排序:
pages = [ {'title': '十年学会程序设计', 'time': '2012-02-14', 'name': '21-days'}, {'title': 'ANE Toolkit', 'time': '2012-06-07', 'name': 'anetoolkit'}, {'title': 'cocos2d-x-filters', 'time': '2015-05-06', 'name': 'cocos2d-x-filters'}, {'title': '我的Firefox插件', 'time': '2006-05-23', 'name': 'firefox-addons'}, {'title': 'Flash&Flex大全', 'time': '2005-11-02', 'name': 'flashassistant'}, {'title': '提问的智慧', 'time': '2005-10-08', 'name': 'howtoask'}, {'title': 'Linux软件', 'time': '2009-04-30', 'name': 'linux-software'}, {'title': 'Platform ANEs', 'time': '2013-08-22', 'name': 'platform-anes'}, {'title': '阅读', 'time': '2015-03-03', 'name': 'read'}, {'title': 'Sprite Sheet Editor', 'time': '2011-08-18', 'name': 'sprite_sheet_editor'}, {'title': 'SpriteSheetPacker', 'time': '2011-04-19', 'name': 'spritesheetpacker'}, {'title': 'WordPress大全', 'time': '2006-03-07', 'name': 'wordpressfavorite'}, {'title': 'WPCMD', 'time': '2015-06-12', 'name': 'wpcmd'} ]
首先,排序需要一个可以比较的对象,我使用键名为 index
中的对象:
from datetime import date for item in pages: t = item['time'].split('-') 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
方法:
pages.sort(key=lambda item : item['index'])
在这里,我需要为 key 传递一个函数,这个函数能返回需要比较的值。
当然,也可以使用 operator
提供的 itemgetter
方法来获取这个待比较的值。
from operator import itemgetter names.sort(key=itemgetter('index'))
除了 itemgetter 之外, operator 模块还提供了 attrgetter 和 methodcaller 。
张贺 对上面提到的 Sorting Mini-HOW TO 做了一些必要的中文评注,该文和 Sorting HOW TO 基本相同。
如果想要再了解一点,可以看这篇 通过某个关键字排序一个字典列表 和 排序不支持原生比较的对象 。
当然,你最好先把 Sorting HOW TO 看完。
(全文完)