Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么pprint模块对dict键的排序与打印不同?_Python - Fatal编程技术网

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迭代器行为返回键的顺序,该顺序未定义,可能因实现和机器而异。