dict.values()是否以有序序列返回?

时间:2017-09-22 08:46:11

标签: python dictionary

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'

5 个答案:

答案 0 :(得分:1)

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

来自python 2.x docs

  

如果items(),keys(),values(),iteritems(),iterkeys()和   调用itervalues()而不对其进行干预修改   字典,列表将直接对应。

python 3.x docs中:

  

键和值以任意顺序迭代,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史。

因此,在您修改字典之前,返回的序列始终相同。你不能对被分类的对象做出假设。

看看this question and the answers to it他们在哪里讨论实际订购python 3.6+ dicts的原因(以及如何)。

答案 1 :(得分:0)

答案 2 :(得分:0)

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

简而言之:让我们说这个dict是初始化为8个插槽阵列的对象。当你向dict添加一个新的键值对时,它hashes键使用一个函数返回键所在的槽。这不是确定性的,因为可能已经采用了时隙;所以你需要重新评估并寻找另一个插槽。

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

例如,考虑一下这个简单的字典:

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

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

如果我更改了键的顺序,当打印dict键值对时,它也会显示不同。但是看看如果我使用不同的密钥会发生什么

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

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

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

答案 3 :(得分:0)

字典存储为哈希表。在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

答案 4 :(得分:-1)

这取决于python中有关dict如何排序的几个方面。你不应该考虑它,因为在dict中排序并不重要。