-1

假设我正在使用以下 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()还会保留相同的订单?

正如我所观察到的,它似乎确实保留了订单,但我无法证明这一点。

4

3 回答 3

0

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

注意:python 3.7 之后,标准字典也保证保持插入顺序。

于 2019-09-22T12:59:33.013 回答
0

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

于 2019-09-22T13:00:22.490 回答
0

是的。OrderedDict.items()items按照它们插入的顺序返回。

如果您检查 的执行OrderedDict您可以看到items返回_OrderedDictItemsView

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

如果你深入挖掘并找到的实现_OrderedDictItemsView

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

现在我们的旅程已经到达了它的目的地,我们可以看到这_mappingOrderedDict我们创造的,它总是井然有序的。该__iter__方法ItemsView只是遍历OrderedDict. 因此证明:)

于 2019-09-22T13:05:59.020 回答