如何按插入顺序从字典中检索项目?

时间: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"

并只需要这个文件