Ste*_*ann 10 python dictionary set python-3.x pprint
我知道dicts和sets不是有序的,所以相同的set或dicts可能会以不同的方式打印(所有测试都使用Python 3.6.1):
>>> for obj in {0, 8}, {8, 0}, {0:0, 8:8}, {8:8, 0:0}:
print(obj)
{0, 8}
{8, 0}
{0: 0, 8: 8}
{8: 8, 0: 0}
Run Code Online (Sandbox Code Playgroud)
我只是意识到pprint
("漂亮的印刷品")对dicts进行了排序,但没有设置:
>>> for obj in {0, 8}, {8, 0}, {0:0, 8:8}, {8:8, 0:0}:
pprint.pprint(obj)
{0, 8}
{8, 0}
{0: 0, 8: 8}
{0: 0, 8: 8}
Run Code Online (Sandbox Code Playgroud)
它的文档还说"字典在计算显示之前按键排序".但为什么不排序?对我来说似乎不太好看.有没有办法让它排序?也在嵌套结构中,因为这是一个主要目的pprint
.
这是在问题 27495中提出的,它是一个错误,而不仅仅是一个设计选择,但显然尚未解决。
这是该问题的另一个示例,它可能更清楚地说明了您在 Python 3 中识别的行为:
Run Code Online (Sandbox Code Playgroud)>>> import string, pprint >>> pprint.pprint(set(string.digits)) {'7', '1', '9', '8', '3', '0', '2', '5', '6', '4'}
这同样适用frozenset()
,但请注意多行pprint
输出在 Python 3中排序,例如:
Run Code Online (Sandbox Code Playgroud)>>> pprint.pprint(set(string.digits), width=1) {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
但是,在 Python 2 中,对相同原始代码的输出进行了排序:
Run Code Online (Sandbox Code Playgroud)>>> pprint.pprint(set(string.digits)) set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
我认为是 Python 3 和 Python 2 之间以及单行多行行为之间的不一致导致了这个错误。
对于dict
s,一个类似的例子,正如您所注意到的,说明输出在 Python 3 或 2 中排序,因为它应该是:
>>> pprint.pprint({i:None for i in set(string.digits)})
{'0': None,
'1': None,
'2': None,
'3': None,
'4': None,
'5': None,
'6': None,
'7': None,
'8': None,
'9': None}
Run Code Online (Sandbox Code Playgroud)
然而,对于 Python 3.6,pprint
排序dict
s可能会令人惊讶,因为它们现在是有序的。但是,由于这只是一个实现细节(目前),我想没有义务pprint
维护插入顺序(还),并且这样做会破坏pprint
始终排序dict
s 的Python 版本之间的一致性。