Python OrderedDict.items()是否也保留订单?

Python OrderedDict.items()是否也保留订单?,python,ordereddictionary,python-collections,Python,Ordereddictionary,Python Collections,假设我正在使用以下OrderedICT: order\u dict=orderedict([(“a”,1),(“b”,2),(“c”,3)]) 在某个时候,我希望获得(key,value)项并定义一个迭代器,并在需要时开始移动它: ordered_dict_items_iter = iter(ordered_dict.items()) ... key,val = next(ordered_dict_items_iter) ... 我想知道订单\u dict.items()是否也会保留相同的订单

假设我正在使用以下OrderedICT:

order\u dict=orderedict([(“a”,1),(“b”,2),(“c”,3)])

在某个时候,我希望获得(key,value)项并定义一个迭代器,并在需要时开始移动它:

ordered_dict_items_iter = iter(ordered_dict.items())
...
key,val = next(ordered_dict_items_iter)
...
我想知道
订单\u dict.items()
是否也会保留相同的订单


正如我观察到的,它似乎确实保持了秩序,但我无法证明它。

它确实如此。
OrderedDict
的思想是,is的行为完全像一个字典,但在内部它是一个元组列表,表示键值对,因此顺序得以保留。使用此元组列表复制所有字典方法


注意:在Python3.7之后,标准字典也保证保持插入顺序。

是,它将保留您在初始化字典时指定的顺序。

OrderedDict.items()
将按照插入的顺序返回

如果您检查了
OrderedDict
,您可以看到
返回
\u OrderedDict项视图

class OrderedDict(dict):
    ...
    ...
    def items(self):
        "D.items() -> a set-like object providing a view on D's items"
        return _OrderedDictItemsView(self)
如果您深入挖掘并找到
\u OrderedDictItemsView

class _OrderedDictItemsView(_collections_abc.ItemsView):

    def __reversed__(self):
        for key in reversed(self._mapping):
            yield (key, self._mapping[key])
如果你更深入地检查,你会看到

class ItemsView(MappingView, Set):
    ...
    ...
    def __iter__(self):
        for key in self._mapping:
           yield (key, self._mapping[key])
再往下走,你会看到

class MappingView(Sized):

    __slots__ = '_mapping',

    def __init__(self, mapping):
        self._mapping = mapping
现在我们的旅程已经到达了目的地,我们可以看到
\u映射
就是我们创建的
OrderedDict
,并且始终是有序的。
\uuu iter\uuu
方法
ItemsView
,只需迭代
OrderedDict
中的每个键值。因此证明:)

是的
OrderedDict.items()
按插入顺序返回项目