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



在python中,字典{1:1,2:2,3:3}{3:3,2:2,1:1}都会产生"{1:1,2:2,3:3}" str(('d?

我可以依靠这种排序,或者至少依靠包含相同键/值对的字典在通过 str(( 函数时会生成相同的字符串这一事实吗?

您不能依赖这两个属性中的任何一个。 字典转换为字符串时的顺序还取决于键/值对的插入顺序。

通过对Python源代码的一些了解(观看PyCon 2010的The Mighty Dictionary(,或者一些反复试验,你可以很容易地找到反例:

>>> {1: 1, 9: 9}
{1: 1, 9: 9}
>>> {9: 9, 1: 1}
{9: 9, 1: 1}

dict内置类型不保证键的任何特定顺序。

即使看起来你总是得到相同的字符串,也不要依赖这个。如果这样做,则在升级 Python 时,实现中可能会发生更改,从而导致假设失败。

确实提供了有关键顺序的保证。

不,你不能依赖它。正如在学习 Python 中提到的。马克·卢茨(Mark Lutz(的第4版(第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项的顺序是可靠的(您可以依赖它,因为在您明确更改它之前它不会更改(。

不,你不能。试试这个:

{ 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: ''}

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

最新更新