转自:http://zoomq.qiniudn.com/ZQScrapBook/ZqFLOSS/data/20111219235951/
Python中的有序字典(OrderedDict)
很早以前就知道的东西,不过刚才看了一下,好像还是有记一下的必要。
问题是这样的:我们都知道Python的字典(dict)是无序的,如果我们希望这个字典有序怎么办?这个功能其实在Python的2.7和3.1里得到了实现,就是OrderedDict。大家可以参考一下这篇PEP:Adding an ordered dictionary to collections。当然,还有Python的官方文档:8.3.6. OrderedDict objects由于Python 2.7已经在发布,所以这个问题倒也不是很大。
不过,我现在仍在使用Python 2.6,估计在一个月之内还不会换2.7,那么怎么办呢?像这位老兄一样,自己实现OrderedDict吗?当然,我们也知道,很早以前就有人给出过解答:Python中dict的有序输出(排序)。
但其实,还有一个更懒的办法,因为已经有人实现了有序字典,Python Utils 。这个模块里不光实现了OrderedDict类,也实现了其它一些有用的东西,像standout模块也很有用,不过这个不是本文的重点。我们只需要装一下Python Utils,然后读一下文档就行,不需要再自己考虑实现一个有序字典。
PS: gentoo的用户可以直接安装Python Utils模块,运行如下命令即可:
django中也自带了一个有序的字典,转自:http://blog.csdn.net/jianhong1990/article/details/8983583
根据名字来理解sorteddict:排序过的字典。它支持按索引来操作字典。
A dictionary that keeps its keys in the order in which they're inserted.
它提供了两个有用的方法
- insert(index, key, value)
- value_for_index(index)
注意事项:
- d = SortedDict({
- 'b': 1,
- 'a': 2,
- 'c': 3
- })
上述方法是无效的,sorteddict不知道插入顺序。
下面的方法是有效的:
- from django.utils.datastructures import SortedDict
- d2 = SortedDict()
- d2['b'] = 1
- d2['a'] = 2
- d2['c'] = 3
最后一个demo:
- from django.utils.datastructures import SortedDict
- d2 = SortedDict()
- d2['b'] = 1
- d2['a'] = 2
- d2['c'] = 3
- print d2
- d2.insert(2,'f',4)
- print d2
- print d2.value_for_index(0)
输出:
- {'b': 1, 'a': 2, 'c': 3}
- {'b': 1, 'a': 2, 'f': 4, 'c': 3}
- 1