Python 为什么pprint模块对dict键的排序与打印不同?
Python 为什么pprint模块对dict键的排序与打印不同?,python,Python,pprint按字母顺序对dicts键排序,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的文档提到了这一点,但没有说明原因。为什么会有这种差异?pprint代表“漂亮的印刷品”,也意味着“令人赏心悦目,易于
pprint
按字母顺序对dicts键排序,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
的文档提到了这一点,但没有说明原因。为什么会有这种差异?pprint
代表“漂亮的印刷品”,也意味着“令人赏心悦目,易于阅读”。排序dict
键就是为了达到这个目的,pprint
基本上不应该很快(排序键会增加惩罚),但是,呃,很漂亮。:)
打印
另一方面,尽可能快地“只打印”。实际上,这里的差异是dict
的\uuu str\uuu
和pprint
精心制作的字符串转换之间的差异。pprint
代表“漂亮的打印”,也意味着“赏心悦目,易于阅读”。排序dict
键就是为了达到这个目的,pprint
基本上不应该很快(排序键会增加惩罚),但是,呃,很漂亮。:)
打印
另一方面,尽可能快地“只打印”。实际上这里的差异是dict
的\uuu str\uuu
和pprint
的巧尽心思的字符串转换之间的差异。pprint
必须实现一些不同于普通打印的东西,因为据说它很漂亮。好吧,输出仍然不是很好,但至少分类了
使用print
打印词典很可能与其内部实现(树?哈希表?)有关。请注意,字典要求元素是可散列的,所以我在这里寻找一些排序规则。在我的例子中,如果我用正整数填充字典,我的输出将被排序(hash(int)==int
)。无论规则是什么,print
语句只是以最方便、最快的方式在字典中穿行,不能假定任何特定的顺序。pprint
必须实现与普通print
不同的功能,因为它被告知是漂亮的。好吧,输出仍然不是很好,但至少分类了
使用print
打印词典很可能与其内部实现(树?哈希表?)有关。请注意,字典要求元素是可散列的,所以我在这里寻找一些排序规则。在我的例子中,如果我用正整数填充字典,我的输出将被排序(hash(int)==int
)。无论规则是什么,print
语句只是以最方便、最快的方式在字典中穿行,任何特定的顺序都不能被假定。那么,“仅仅因为它是这样”呢?不,因为它是这样写的,目的就在眼前。例如,pprint用于调试,对键进行排序可以更容易地找到您要查找的信息。那么,“仅仅因为它是这样”呢?不,因为它是这样写的,并且考虑到了目的。例如,pprint用于调试,对键进行排序可以更轻松地查找您要查找的信息。不,如果您使用碰巧选择的特定正整数填充字典,则输出将被排序,但如果您选择了不同的整数,则可能未对其进行排序:例如,dict.fromkeys([1,8])
->{8:None,1:None}
。dict的str
方法按键在哈希表中的存储顺序输出键,pprint
不使用str
,因此它可以对键进行排序,并在适当的地方插入换行符。@duncan,当然你是对的,我做了这个快速测试,添加了数字序列,但实际上什么也没说。有趣的是,人们可以通过在迭代时检查元素的顺序来揭示底层实现(从您的示例来看,哈希表从8个bucket开始)。不,如果您使用碰巧选择的特定正整数填充字典,那么输出将被排序,但是如果您选择了不同的整数,它可能没有被排序:例如,dict.fromkeys([1,8])
->{8:None,1:None}
。dict的str
方法按键在哈希表中的存储顺序输出键,pprint
不使用str
,因此它可以对键进行排序,并在适当的地方插入换行符。@duncan,当然你是对的,我做了这个快速测试,添加了数字序列,但实际上什么也没说。有趣的是,我们可以通过在迭代时检查元素的顺序来揭示底层实现(从您的示例来看,哈希表似乎以8个bucket开始)。说print以默认顺序对它们排序是不正确的。关键是print不会对它们进行排序,而pprint
会显式地对它们进行排序print
仅使用dict迭代器行为返回键的顺序,该顺序未定义,并且可能因实现和机器而异。说print按默认顺序对键进行排序是不正确的。关键是print不会对它们进行排序,而pprint
会显式地对它们进行排序print
仅使用dict迭代器行为返回键的顺序,该顺序未定义,可能因实现和机器而异。