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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 中的对象:

1
2
3
4
5
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 方法:

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

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

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

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

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

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

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

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

(全文完)

留言

2015-06-20
次访问