有序字典:值也是有序的吗?

16

collections.OrderedDict 的文档把 OrderedDict 描述为一个能够记住键值被插入顺序的字典。

因此,键值的顺序

for k in dict:
  ...

for k in dict.keys():
  ...

是可以预测的。

然而,它并没有涉及任何值方面的内容。如果我只需要按如下迭代值,结果是否也会遵循插入顺序呢?

for v in dict.values():
  ...

在CPython中进行了几个快速的测试,结果显示是这样的,但这可能只是与当前实现巧合(我没有测试其他任何实现)。

2个回答

17
是的,所有字典中keys()values()返回的列表都按照对应的顺序排列,不仅仅是有序字典。
在Python 3.6之前,普通字典的顺序是任意的,但它与keys()values()items()返回的任意顺序相同,前提是在调用这些方法之间没有修改字典。
从CPython 3.6开始,字典会保持插入顺序。从Python 3.7开始,这已成为一个明确的保证。

3
是的,它们按照键的顺序进行排序。所有 dict 实现都是如此。
键和值以任意顺序迭代,该顺序是非随机的,在 Python 实现之间变化,并取决于字典插入和删除的历史记录。如果在对字典没有介入修改的情况下遍历键、值和项目视图,则项目的顺序将直接对应。这允许使用 zip() 创建 (value, key) 对: pairs = zip(d.values(), d.keys())。创建相同列表的另一种方法是pairs = [(v, k) for (k, v) in d.items()]
参考链接:https://docs.python.org/3/library/stdtypes.html#dict-views

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接