我知道Python中的字典本身没有顺序。但是,如果你在字典上调用str()
,如果它总是以相同的顺序,我很好奇。它似乎是按键分类的,无论我添加项目的顺序如何:
d={}
d[5]=5
d[1]=1
d["z"]="z"
d["a"]="a"
s=str(d)
print(s)
我知道很多人都会想说它没有排序,但请试着通过获得未分类的结果来证明我的错误。
那么,字典是否转换为默认情况下在Python 3.4中排序的字符串?
答案 0 :(得分:3)
不,他们不是。
import string
d = {}
for ch in string.ascii_lowercase:
d[ch * 20] = ch
print(d) # OR print(str(d))
输出(由于散列随机化,每次运行都会改变):
{'jjjjjjjjjjjjjjjjjjjj': 'j', 'ssssssssssssssssssss': 's', 'mmmmmmmmmmmmmmmmmmmm': ...
答案 1 :(得分:3)
注意: Python 3.6引入了一个新的order-preserving implementation
dict
,这使得以下内容从3.6开始过时。
以下是三个不同的Python 3.4解释器会话中示例的三次迭代:
Python 3.4.1 (default, Aug 8 2014, 15:05:42)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d={}
>>> d[5]=5
>>> d[1]=1
>>> d["z"]="z"
>>> d["a"]="a"
>>> s=str(d)
>>> print(s)
{1: 1, 'z': 'z', 'a': 'a', 5: 5}
Python 3.4.1 (default, Aug 8 2014, 15:05:42)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d={}
>>> d[5]=5
>>> d[1]=1
>>> d["z"]="z"
>>> d["a"]="a"
>>> s=str(d)
>>> print(s)
{1: 1, 'a': 'a', 5: 5, 'z': 'z'}
Python 3.4.1 (default, Aug 8 2014, 15:05:42)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d={}
>>> d[5]=5
>>> d[1]=1
>>> d["z"]="z"
>>> d["a"]="a"
>>> s=str(d)
>>> print(s)
{1: 1, 5: 5, 'z': 'z', 'a': 'a'}
所以,不,字符串表示没有排序,甚至在解释器的调用中也没有排序。在Python版本(包括3.2版本)中,字典的顺序(及其字符串表示)是任意的但是一致的 - 但是,由于security fix,这在Python 3.3中发生了变化:
默认情况下,str,bytes和datetime对象的
__hash__()
值使用不可预测的随机值“加盐”。尽管它们在单个Python进程中保持不变,但在重复调用Python之间无法预测它们。这旨在提供针对由精心选择的输入引起的拒绝服务的保护,该输入利用dict插入的最坏情况性能,O(n ^ 2)复杂度。有关详细信息,请参阅http://www.ocert.org/advisories/ocert-2011-003.html。
更改散列值会影响dicts,集和其他映射的迭代顺序。 Python从未对这种排序做出保证(通常在32位和64位版本之间有所不同)。