是否可以按照插入的顺序从Python字典中检索项目?
标准的python dict
无法做到这一点.
有一个建议(PEP 372)将"有序字典"(跟踪插入顺序)添加到collections.OrderedDict
标准库中的模块.它包含指向有序词典的各种 实现 的 链接(另请参阅Python Cookbook中的这两个配方).
如果您希望代码与"官方"版本兼容(如果最终接受提案),您可能希望坚持PEP中的参考实现.
编辑:PEP被接受并添加在python 2.7和3.1中.查看文档.
其他答案都是正确的; 这是不可能的,但你可以自己写.但是,如果您不确定如何实际实现这样的东西,这里是一个完整且有效的实现,它是我刚刚编写和测试的子类dict.(请注意,传递给构造函数的值的顺序是未定义的,但会在稍后传递的值之前出现,并且您可能始终只是不允许使用值初始化有序的dicts.)
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')]
使用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
从Python 3.7开始,标准dict保留了插入顺序.来自文档:
在版本3.7中更改:字典顺序保证为插入顺序.这种行为是来自3.6的CPython的实现细节.
因此,您应该能够正常迭代字典或使用popitem()
.
或者,只需使用time.now()作为元组中的第一个字段,使密钥成为元组.
然后你可以使用dictname.keys(),sort和voila检索密钥!
格里
您无法使用基本dict类执行此操作 - 它按哈希顺序排序.您可以构建自己的字典,它实际上是一个键,值对或某些列表,它们将被订购.