Python字典,如何保持键/值的声明相同的顺序?

Python新手,对字典有疑问。 我有一个字典,我以一个特定的顺序宣布,并希望始终保持这个顺序。 键/值不能真正保持它们的价值的顺序,我只是想它的顺序,我宣布它。

所以如果我有字典:

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10} 

如果我查看它或遍历遍历它不是这样的顺序,有没有办法确保Python将保持我声明的键/值的显式顺序?

使用Python 2.6

 from collections import OrderedDict OrderedDict((word, True) for word in words) 

包含

 OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)]) 

如果值为True (或任何其他不可变对象),则还可以使用:

 OrderedDict.fromkeys(words, True) 

我将举一个简单的例子,而不是解释理论部分。

 >>> from collections import OrderedDict >>> my_dictionary=OrderedDict() >>> my_dictionary['foo']=3 >>> my_dictionary['aol']=1 >>> my_dictionary OrderedDict([('foo', 3), ('aol', 1)]) 

从Python 3.6开始,标准dicttypes默认保持插入顺序。

定义

 d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10} 

将导致在源代码中列出的按键顺序的字典。

这是通过使用稀疏哈希表的整数的简单数组来实现的,其中那些整数索引到存储键值对(加上计算的哈希)的另一个数组中。 后面的数组恰好恰好以插入顺序存储项目,整个组合实际上使用的内存比Python 3.5和之前的实现less。 细节请参阅Raymond Hettinger最初的想法 。

这仍然被认为是一个实施细节; Python的未来版本可能会强制dict保留顺序。 请参阅Python 3.6文档中的新增function

这个新实现的顺序保留方面被认为是一个实现细节,不应该被依赖(这可能会在将来发生变化,但是希望在改变语言规范之前在几个版本中使用这个新的dict实现语言为所有当前和未来的Python实现指定保留顺序的语义;这也有助于保持随机迭代顺序仍然有效的老版本语言的向后兼容性,例如Python 3.5)。

python字典是无序的。 如果你想要一个有序的字典,请尝试collections.OrderedDict 。

请注意,OrderedDict是在Python 2.7中引入到标准库中的。 如果您有较旧版本的Python,可以在ActiveState上find有序字典的配方。

字典将使用一个命令,使search效率,你不能改变,

你可以使用一个对象列表(一个简单的例子,甚至一个类的元素),并附加项目的结尾。 然后,您可以使用线性search来查找其中的项目。

或者,您可以创build或使用为维护订单而创build的不同数据结构。

我在试图弄清楚如何让OrderedDict工作的时候遇到了这个post。 PyDev for Eclipse根本找不到OrderedDict,所以我决定做一个字典的键值的元组,因为我希望它们是有序的。 当我需要输出我的列表时,我只是遍历元组的值,并将元组中迭代的“键”插入到字典中,以我需要的顺序检索我的值。

例:

 test_dict = dict( val1 = "hi", val2 = "bye", val3 = "huh?", val4 = "what....") test_tuple = ( 'val1', 'val2', 'val3', 'val4') for key in test_tuple: print(test_dict[key]) 

这有点麻烦,但我时间紧迫,这是我想出的解决方法。

注意:其他人提出的列表方法对我来说并没有什么意义,因为列表是按照顺序排列和索引的(也是与字典不同的结构)。

一般来说,你可以devise一个类似字典的类,主要是实现__contains____getitem____delitem__ __contains__ __getitem____delitem__ __setitem__等等方法。 这个类可以有你喜欢的任何行为,例如通过键来对一个已sorting的迭代器进行私有化。

在开发一个Django项目时,我遇到了类似的问题。 我不能使用OrderedDict,因为我运行的是旧版本的Python,所以简单的解决scheme是使用Django的SortedDict类:

https://code.djangoproject.com/wiki/SortedDict

如果您希望按特定顺序拥有字典,则还可以创build一个列表,其中第一个项目是关键字,第二个项目将是该值,并且将如下所示

 >>> list =[[1,2],[2,3]] >>> for i in list: ... print i[0] ... print i[1] 1 2 2 3 

你不能用字典来做你想做的事情。 您已经创build了字典d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10} 。 一旦创build完成,我发现无法保持秩序。 我所做的就是用对象创build一个json文件:

 {"ac":33,"gw":20,"ap":102,"za":321,"bs":10} 

我用了:

 r = json.load(open('file.json'), object_pairs_hook=OrderedDict) 

然后使用:

 print json.dumps(r) 

核实。