2009-12-09 39 views
17

研究员顺序贮藏Python字典条目:在它们被推

Python字典被存储在任何特定的顺序(映射有没有顺序),例如,

​​

虽然可以检索一个从字典中排序的列表或元组,我想知道是否有可能让字典按照它们传递给它的顺序存储这些项目,在前面的例子中,这意味着内部排序为{'first':'uno','second':'dos','third':'tres'},没有什么不同。

我需要这个,因为我正在使用字典存储值,因为我从配置文件中读取它们;一旦读取并处理(这些值被改变)时,它们必须被写入到一个新的配置文件中的相同的顺序,因为他们读取(该顺序是不按字母顺序排列,也不数值)。

有什么想法?

编辑: 请注意,我不是在寻找二次方法来检索顺序(如列表),但方法可以让词典本身进行排序(因为它会在Python的未来版本) 。

+2

http://stackoverflow.com/questions/1867861/python-dictionary-keep-keys-values-in-same-order-as-declared – 2009-12-09 08:16:09

+0

@ Ofri雷维吾:确切的同样的问题。谢谢。 – Escualo 2009-12-09 08:24:33

+1

既然你正在努力维持秩序,首先它不是一本真正的字典。你做了太多事情。您可能希望字典(用于映射)和列表(保留顺序)。没有错。 – 2009-12-09 11:46:45

回答

30

尝试蟒蛇2.7及以上,大概3.1,有OrderedDict

http://www.python.org/

http://python.org/download/releases/2.7/

保序字典
>>> from collections import OrderedDict 
>>> d = OrderedDict([('first', 1), ('second', 2), 
...     ('third', 3)]) 
>>> d.items() 
[('first', 1), ('second', 2), ('third', 3)] 

PEP 372: Adding an ordered dictionary to collections

+0

不错,但请记住这是即将发布的Python版本的一个新功能,不适用于旧版本 – akr 2009-12-09 08:17:58

+0

...但我被困在2.5.1 :( – Escualo 2009-12-09 08:20:08

+3

或从这个补丁获得OrderedDict的源代码:http://bugs.python.org/issue5397 – 2009-12-09 08:20:28

4

使用列表保存密钥为了

+0

快速和肮脏。唉,不是很紧凑(可以变脆)。 – 2009-12-09 08:15:10

+0

这有效,但我正在寻找更“自然”的方式,如果有的话。似乎S.Mark提出的OrderedDict是我正在寻找的替代方案。不幸的是,我被Python 2.5.1( – Escualo 2009-12-09 08:19:30

+1

)卡住了。如果你使用dict接口封装了dict和list在单个对象中,顺便说一句,这是许多Ordered Dict实现做的事情(不知道实际的实现采用2.7) – 2009-12-09 08:20:46

1

字典用Python实现为哈希表,这就是为什么为了随机出现。你可以实现你自己的字典变体,但是你会失去方便的语法。相反,还要记录键的顺序。

初始化:

keys = [] 
myDict = {} 

虽然阅读:

myDict[key] = value 
keys.append(key) 

虽然写作:

for key in keys: 
    print key, myDict[key] 
+0

我的密钥不是按字母顺序或数字顺序排列:(它们可以是任何东西 – Escualo 2009-12-09 08:11:46

+0

你不需要在任何语法上丢失任何语法,只需实现__get __()和__set __()等特殊方法,使用类似于dict ['key']和dict ['key1'] = newvalue的语法 – Isaac 2009-12-09 08:21:56

3

实现肯定是存在的。

this one in Django,容易被称为SortedDict,这将工作在Python> = 2.3 iirc。

+0

刚刚注意到这将在Django 1.9中被弃用。 – imns 2014-04-22 13:33:42

-2

有一个很简短的回答是.. 做this--

dictCopy = yourdictname.copy()

然后用dictCopy,它会以相同的顺序。

+0

Python中的字典没有排序,因此是个问题。 – Escualo 2013-11-14 18:35:52

1

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

>>> from collections import OrderedDict 
>>> my_dictionary=OrderedDict() 
>>> my_dictionary['foo']=3 
>>> my_dictionar['aol']=1 
>>> my_dictionary 
OrderedDict([('foo', 3), ('aol', 1)]) 
相关问题