{1:1,2:2,3:3}
和{3:3,2:2,1:1}
都会生成"{1:1,2:2,3:3}"
我可以依赖这种排序,或者至少是因为包含相同键/值对的dicts在通过str()函数时会生成相同的字符串吗?
答案 0 :(得分:6)
您可以同时依赖这两个属性。转换为字符串时字典的顺序还取决于键/值对的插入顺序。
通过对Python源代码的一些了解(来自PyCon 2010的观察The Mighty Dictionary),或者一些试验和错误,您可以轻松找到反例:
>>> {1: 1, 9: 9}
{1: 1, 9: 9}
>>> {9: 9, 1: 1}
{9: 9, 1: 1}
答案 1 :(得分:4)
dict
内置类型不保证密钥的任何特定顺序。
即使你似乎总是得到相同的字符串,也不要依赖于此。如果这样做,当您升级Python时,实现可能会发生变化,导致您的假设失败。
OrderedDict类 提供有关密钥顺序的保证。
答案 2 :(得分:1)
不,你不能依赖。正如Learning Python. 4th Edition by Mark Lutz(第94页)中所述:
(...)因为字典不是序列,所以它们不维护 可靠的从左到右的顺序。这意味着如果我们制作一本字典并打印出来 返回,它的键可能会以不同的顺序返回,而不是我们键入的键(...)
然而,本书提到了另一种按键顺序打印键值对的解决方案(D
是你想要的词典):
>>> for key in sorted(D):
print(key, '=>', D[key])
通过使用上述内容,您可以以任何您喜欢的方式打印项目,甚至可以创建包含有序元素的序列,如下所示:
>>> D = {'a': 12, 'b': 65, 7: 'asd'}
>>> S = [(key, D[key]) for key in sorted(D)]
>>> S
[(7, 'asd'), ('a', 12), ('b', 65)]
S
中项目的顺序是可靠的(您可以依赖它,因为在您明确更改之前它不会更改)。
答案 3 :(得分:1)
{ i:i for i in range(0, 100, 10) }
它适用于从零开始的连续整数的原因是每个整数散列到自身(hash(i) == i
),字典会将其内部表的大小设置为至少与它们所持有的元素一样大(它们使用探测)战略,这需要这个)。因此,整数i
最终在插槽i
中没有冲突。你还会发现从其他数字开始的连续整数往往也会单调增加,但它们可能会在中间某处包围:
>>> { i:'' for i in range(25, 35) }
{32: '', 33: '', 34: '', 25: '', 26: '', 27: '', 28: '', 29: '', 30: '', 31: ''}
重要的是要注意,这些仅仅是对实际行为的观察。语言中没有任何内容可以保证这一点,所以你不能依赖它。