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

2024-05-16 20:22:54 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我正在使用以下OrderedDict:

order_dict = OrderedDict([("a",1), ("b",2), ("c",3)])

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

ordered_dict_items_iter = iter(ordered_dict.items())
...
key,val = next(ordered_dict_items_iter)
...

我想知道order_dict.items()是否也会保持相同的顺序

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


Tags: key证明定义顺序valueorderitemsval
3条回答

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

是的。OrderedDict的思想是,is的行为就像一个字典,但在内部它是一个元组列表,表示键值对,所以顺序是保持不变的。所有字典方法都使用这个元组列表进行复制

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

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

如果检查OrderedDictimplementation,可以看到items返回_OrderedDictItemsView

class OrderedDict(dict):
    ...
    ...
    def items(self):
        "D.items() -> a set-like object providing a view on D's items"
        return _OrderedDictItemsView(self)

如果你深入挖掘并找到_OrderedDictItemsViewimplementation

class _OrderedDictItemsView(_collections_abc.ItemsView):

    def __reversed__(self):
        for key in reversed(self._mapping):
            yield (key, self._mapping[key])

如果你深入查看_collections_abc.ItemsView,你会发现

class ItemsView(MappingView, Set):
    ...
    ...
    def __iter__(self):
        for key in self._mapping:
           yield (key, self._mapping[key])

再往下走MappingView,你会看到

class MappingView(Sized):

    __slots__ = '_mapping',

    def __init__(self, mapping):
        self._mapping = mapping

现在我们的旅程已经到达了目的地,我们可以看到_mapping就是我们创建的OrderedDict,它总是井然有序的。__iter__方法ItemsView,只是遍历OrderedDict中的每个键值。因此证明:)

相关问题 更多 >