有时候我们想起要对字典进行排序,但在python中dict对象中的键值对是没有顺序的,但是在collections模块中有个子类OrderedDict,它能记住字典的插入顺序。
>>> d = {2:'b',1:'a',3:'c'}
>>> d
{1: 'a', 2: 'b', 3: 'c'}
>>> d[0]='z'
>>> d
{0: 'z', 1: 'a', 2: 'b', 3: 'c'}
标准dict对象添加元素保存在字典中是没有顺序的,从上代码可以看出,但对于OrderedDict就不一样。
>>> od = collections.OrderedDict({2:'b',1:'a',3:'c'})
>>> od
OrderedDict([(1, 'a'), (2, 'b'), (3, 'c')])
>>> od[0]='z'
>>> od
OrderedDict([(1, 'a'), (2, 'b'), (3, 'c'), (0, 'z')])
od的最后一个项就是最后加入的,很好的按照插入的先后顺序保存在其中。
利用OrderedDict就可以根据自己的需求来自定义排序的规则。
>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
上面的lambda函数还是也可以用operator.itemgetter函数来代替,如:
>>> # dictionary sorted by key
>>> import operator
>>> OrderedDict(sorted(d.items(), key=operator.itemgetter(0)))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
关注公众号「Python之禅」,回复「1024」免费获取Python资源