2008-09-13 98 views

回答

49

标准python dict无法做到这一点。

有一个建议(PEP 372)向标准库中的collections模块添加一个“有序字典”(记录插入顺序)。它包括链接variousimplementationsofordereddictionaries(也可参见Python食谱中的这些tworecipes)。

如果您希望自己的代码与“官方”版本兼容(如果提案最终被接受),您可能希望坚持使用PEP中的参考实现。

编辑:PEP被接受并在python 2.7和3.1中添加。见the docs

6

你不能使用基类字典类来做到这一点 - 它是由哈希排序。你可以建立你自己的字典,这个字典实际上是一个关键字,值对或者其他的列表,它们将被排序。

+2

您的字典实现可以改为使用标准字典和列表 - 字典存储键 - >值关联,并且列表按照顺序存储密钥y被插入。 – 2008-09-13 21:56:24

18

其他答案是正确的;这是不可能的,但你可以自己写这个。但是,如果你不确定如何实际实现这样的东西,这里有一个完整的工作实现,它的子类是我刚刚编写和测试的字典。 (请注意,值传递给构造的顺序是不确定的,但会晚一点传递的值之前,你可以永远只是不允许有序类型的字典要与值初始化)。

class ordered_dict(dict): 
    def __init__(self, *args, **kwargs): 
     dict.__init__(self, *args, **kwargs) 
     self._order = self.keys() 

    def __setitem__(self, key, value): 
     dict.__setitem__(self, key, value) 
     if key in self._order: 
      self._order.remove(key) 
     self._order.append(key) 

    def __delitem__(self, key): 
     dict.__delitem__(self, key) 
     self._order.remove(key) 

    def order(self): 
     return self._order[:] 

    def ordered_items(self): 
     return [(key,self[key]) for key in self._order] 


od = ordered_dict() 
od["hello"] = "world" 
od["goodbye"] = "cruel world" 
print od.order()   # prints ['hello', 'goodbye'] 

del od["hello"] 
od["monty"] = "python" 
print od.order()   # prints ['goodbye', 'monty'] 

od["hello"] = "kitty" 
print od.order()   # prints ['goodbye', 'monty', 'hello'] 

print od.ordered_items() 
# prints [('goodbye','cruel world'), ('monty','python'), ('hello','kitty')] 
+0

order_dict(('key_a','value_a'),('key_b','value_b'))是否正确排序?看起来_order会被设置为__init__中的self.keys(),它是按散列顺序排序的,而不是它输入的顺序?只是好奇。 – 2008-12-09 20:57:55

+0

你是对的,这就是为什么我说,“传递给构造函数的值的顺序是未定义的,但会在稍后传递值之前出现”。可以对这些对象进行适当排序,但我不确定这是否是一种理想的行为,因为可以说这些对象是同时插入的。 – 2008-12-10 22:13:49

0

如果你不需要字典功能,并且只需要按照插入它们的顺序返回元组,不会有更好的队列工作吗?

7

或者,只要有time.now()作为元组的第一场关键的元组。

然后你可以用dictname.keys(),sort和voila检索密钥!

格里

+1

这使得无法准确了解何时插入字典中的条目是不可能的。它不比键值对更好。 – user2357112 2014-06-04 03:03:22

1

它,除非你存储在单独的列表中的键供以后参考是不可能的。

2

或使用任何用于PEP-372的实施方式的从pythonutils描述here,像odict module

我成功地使用了pocoo。组织实施,这是因为你的

my_dict={} 
my_dict["foo"]="bar" 

my_dict=odict.odict() 
my_dict["foo"]="bar" 

更换一样方便,需要的只是this file

1

你可以做的是插入一个键代表顺序输入的值,并然后在物品上拨打sorted()

>>> obj = {} 
>>> obj[1] = 'Bob' 
>>> obj[2] = 'Sally' 
>>> obj[3] = 'Joe' 
>>> for k, v in sorted(obj.items()): 
...  print v 
... 
Bob 
Sally 
Joe 
>>> 
6

使用OrderedDict(),因为2.7版

的好奇心早晚的事情可供选择:中

from collections import OrderedDict 
a = {} 
b = OrderedDict() 
c = OredredDict() 

a['key1'] = 'value1' 
a['key2'] = 'value2' 

b['key1'] = 'value1' 
b['key2'] = 'value2' 

c['key2'] = 'value2' 
c['key1'] = 'value1' 

print a == b #True 
print a == C#True 
print b == C#False 
相关问题