有序字典

By liuzhijun, 2014-02-15, 分类: 默认

有时候我们想起要对字典进行排序,但在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之禅」(id:vttalk)获取最新文章 python之禅