Python OrderedDict.items()是否也保留订单?
假设我正在使用以下OrderedICT: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()是否也会保留相同的订单
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()
按插入顺序返回项目