是python dict str()函数可靠地排序键?

时间:2011-11-27 21:57:40

标签: python string dictionary

在python中,当str()'d?

时,dict {1:1,2:2,3:3}{3:3,2:2,1:1}都会生成"{1:1,2:2,3:3}"

我可以依赖这种排序,或者至少是因为包含相同键/值对的dicts在通过str()函数时会生成相同的字符串吗?

4 个答案:

答案 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: ''}

重要的是要注意,这些仅仅是对实际行为的观察。语言中没有任何内容可以保证这一点,所以你不能依赖它。