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

时间:2008-09-13 20:38:05

标签: python dictionary

是否可以按照插入的顺序从Python字典中检索项目?

11 个答案:

答案 0 :(得分:50)

标准Python dict默认情况下执行此操作,如果您使用CPython 3.6+(或Python 3.7+用于任何其他Python实现)。

在旧版本的Python上,您可以使用collections.OrderedDict

答案 1 :(得分:17)

其他答案是正确的;这是不可能的,但你可以自己写。但是,如果您不确定如何实际实现这样的东西,这里是一个完整且有效的实现,它是我刚刚编写和测试的子类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')]

答案 2 :(得分:15)

使用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

答案 3 :(得分:6)

或者,只需使用time.now()作为元组中的第一个字段,将密钥设为元组。

然后你可以用dictname.keys(),sort和voila来检索键。

格里

答案 4 :(得分:6)

从Python 3.7开始,标准dict保留插入顺序。来自docs

  

在3.7版中进行了更改:保证字典顺序为插入顺序。此行为是3.6版CPython的实现细节。

因此,您应该能够正常遍历字典或使用popitem()

答案 5 :(得分:5)

您无法使用基本dict类执行此操作 - 它是通过哈希进行排序的。您可以构建自己的字典,它实际上是一个键,值对或某些列表,它们将被订购。

答案 6 :(得分:3)

我之前使用过StableDict取得了很好的成功。

http://pypi.python.org/pypi/StableDict/0.2

答案 7 :(得分:1)

或者使用PEP-372描述的here的任何实现,例如odict module中的pythonutils

我成功使用了pocoo.org实现,它就像替换你的

一样简单
my_dict={}
my_dict["foo"]="bar"

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

并且仅需要this file

答案 8 :(得分:0)

除非您将密钥存储在单独的列表中以便稍后进行引用,否则无法实现。

答案 9 :(得分:0)

您可以使用表示输入顺序的键插入值,然后在项目上调用sorted()

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

答案 10 :(得分:-1)

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