如何按插入顺序从字典中检索项目?
时间:2020-03-05 18:52:49 来源:igfitidea点击:
是否可以按插入顺序从Python字典中检索项目?
解决方案
回答
我们不能使用基dict类执行此操作-它是按哈希排序的。我们可以构建自己的字典,该字典实际上是键,值对或者类似内容的列表,这些列表将被排序。
回答
标准的pythondict
不能做到这一点。
有人建议(PEP 372)在标准库中的"集合"模块中添加一个"有序字典"(跟踪插入顺序)。它包含指向有序词典的各种实现的链接(另请参阅Python Cookbook中的这两个食谱)。
如果我们希望代码与"正式"版本兼容(如果最终接受该建议),则可能要坚持使用PEP中的参考实现。
编辑:PEP被接受并在python 2.7和3.1中添加。参见文档。
回答
其他答案是正确的。这是不可能的,但是我们可以自己编写。但是,如果我们不确定如何真正实现这样的东西,这是一个完整而有效的实现,该实现将我刚刚编写和测试的dict子类化。 (请注意,传递给构造函数的值的顺序是不确定的,但是会在以后传递值之前出现,并且我们始终可以始终不允许使用值初始化有序字典。
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')]
回答
如果我们不需要dict功能,而只需要按照插入它们的顺序返回元组,那么队列会更好吗?
回答
我以前使用过StableDict并取得了成功。
http://pypi.python.org/pypi/StableDict/0.2
回答
或者,只需将键作为一个元组,并将time.now()作为元组的第一个字段。
然后,我们可以使用dictname.keys(),sort和voila检索密钥!
格里
回答
除非我们将密钥存储在单独的列表中以供以后参考,否则是不可能的。
回答
或者使用此处描述的PEP-372的任何实现,例如pythonutils中的odict模块。
我成功使用了pocoo.org实现,就像替换代码一样简单
my_dict={} my_dict["foo"]="bar"
和
my_dict=odict.odict() my_dict["foo"]="bar"
并只需要这个文件