dict.values() 是否按顺序返回?


dict_mark = {'Wang': 'C', 'Li': 'B', 'Ma': 'A'}
s = ''
for c in dict_mark.values():
s += c
print(s)

字典是无序的,那么为什么dict_mark.values()总是像'C' 'B' 'A'一样返回这个值序列呢?

为什么不'B' 'A' 'C''A' 'B' 'C'

无序的dos并不意味着不是确定性的。

来自 python 2.x 文档:

如果 items()、keys()、values()、iteritems()、iterkeys() 和 调用 itervalues() 时不对 字典,列表将直接对应。

在 python 3.x 文档中:

键和值以任意顺序迭代,这是非随机的,因 Python 实现而异,并且取决于字典的插入和删除历史记录。

因此,在您修改字典之前,返回的序列始终相同。您只是无法对在其中排序的对象做出假设。

看看这个问题和答案,他们讨论了为什么(以及如何)在python 3.6+中实际上是有序的。

从 Python 3.6 开始,dict 关键字的顺序是:https://mail.python.org/pipermail/python-dev/2016-September/146327.html

dict将其数据存储在哈希表数据结构中。那么哈希表是如何工作的呢?

简而言之:假设字典被初始化为 8 个插槽数组状对象。当您向字典添加新的键值对时,它会使用返回密钥将驻留的槽的函数hashes键。这不是确定性的,因为插槽可能已经被占用;因此,您需要重新评估并寻找另一个插槽。

这就是为什么从dict.values()更改中检索值的顺序取决于其中的数据。这就是为什么它被称为无序。

例如,考虑以下简单字典:

>>> d = {'a': 1, 'aa': 2}
>>> d
{'a': 1, 'aa': 2}
>>> d = {'aa': 1, 'a': 2}
>>> d
{'aa': 1, 'a': 2}

如果我更改键的顺序,当我打印字典键值对时,它也会有所不同。但是看看如果我使用不同的键会发生什么

>>> d = {'b': 1, 'a': 2}
>>> d
{'a': 2, 'b': 1}

虽然我先说了'b'密钥,但它是在'a'之后分配的。

但是,一旦设置了字典,它在调用dict.items()时将始终返回相同的顺序。

字典存储为哈希表。在 3.6 之前的 Python 版本中,迭代是按照它们在哈希表中出现的顺序完成的,因此这意味着您获得的顺序取决于每个键的哈希值。当存在哈希冲突时,它还可能因插入和删除的顺序而异。

在 Python 2.x 中,字符串的哈希值是一个固定值,因此虽然它可能在 Python 版本之间发生变化,但您将始终看到给定字典的相同顺序和字典上的一组固定操作。

在某些版本的 Python 3 中,字符串的哈希值具有随机因子,因此不同的运行将给出不同的结果。在Python 3.6中,迭代顺序不再依赖于哈希键,因此您将再次获得与插入顺序相关的固定顺序(但不能保证将来不会再次更改)。

$ python2.7 /tmp/t.py
ACB
$ python2.7 /tmp/t.py
ACB
$ python3.5 /tmp/t.py
BCA
$ python3.5 /tmp/t.py
ABC
$ python3.5 /tmp/t.py
CBA

这取决于 python 中的几件事,字典是如何排序的。你不应该考虑它,因为字典中的排序并不重要。

最新更新