按推送顺序存储Python字典条目

时间:2009-12-09 08:04:00

标签: python sorting dictionary mapping

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

>>> myDict = {'first':'uno','second':'dos','third':'tres'}
myDict = {'first':'uno','second':'dos','third':'tres'}
>>> myDict
myDict
{'second': 'dos', 'third': 'tres', 'first': 'uno'}

虽然可以从字典中检索已排序的列表或元组,但我想知道是否可以使字典按照它们传递给它的顺序存储项目,在前面的示例中这将意味着具有内部订购为{'first':'uno','second':'dos','third':'tres'},没有别的。

我需要这个,因为我正在使用字典存储值,因为我从配置文件中读取它们;一旦读取和处理(值被更改),它们必须以与读取时相同的顺序写入新配置文件(此顺序不是字母顺序也不是数字顺序)。

有什么想法吗?

请注意,我不是在寻找检索订单的次要方法(如列表),而是寻找使字典本身有序的方法(因为它将在即将推出的Python版本中)。

6 个答案:

答案 0 :(得分:30)

尝试python 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

答案 1 :(得分:4)

使用列表来保存按键顺序

答案 2 :(得分:3)

保留订单词典的实现肯定存在。

this one in Django,令人困惑地称为SortedDict,可以使用Python> = 2.3 iirc。

答案 3 :(得分:2)

Python中的字典被实现为哈希表,这就是订单随机出现的原因。您可以实现自己的dict变体,但是你会失去方便的语法。相反,也要跟踪密钥的顺序。

初​​始化:

keys = []
myDict = {}

阅读时:

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

写作时:

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:-2)

答案非常简短.. 这样做 -

<强> dictCopy = yourdictname.copy()

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