为什么pprint模块对字典键的排序与print不同?

1 投票
2 回答
682 浏览
提问于 2025-04-16 22:36

pprint 会把字典里的键按字母顺序排列,而 print 则是按照默认的顺序排列这些键。

from pprint import pprint
d = {'foo': 1, 'bar': 2, 'baz': 3}

pprint(d)
# {'bar': 2, 'baz': 3, 'foo': 1}

print d
# {'baz': 3, 'foo': 1, 'bar': 2}

pprint 的说明文档提到了这一点,但没有解释为什么会这样。为什么会有这个不同呢?

2 个回答

0

pprint 可能需要实现一些不同于普通 print 的东西,因为它被称为 漂亮的 打印。虽然输出结果看起来还是不够漂亮,但至少是有序的。

print 打印字典的方式,可能和字典的内部实现有关(比如树结构?哈希表?)。需要注意的是,字典里的元素必须是可哈希的,所以我会在这里寻找一些排序规则。在我的例子中,如果我用正整数填充字典,输出结果就是有序的(hash(int)==int)。不管是什么规则,print 语句只是以最快和最方便的方式遍历字典,所以不能假设有特定的顺序。

6

pprint 是“漂亮打印”的意思,主要是为了让输出看起来更好看,更容易被人理解。对 dict 的键进行排序就是为了达到这个目的,所以 pprint 的速度不是最重要的(排序会让速度变慢),而是要让结果看起来好看。:)

print 则是“直接打印”,尽可能快地输出。其实这里的区别在于 dict__str__ 方法和 pprint 的特别设计的字符串转换方式。

撰写回答