我知道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}
我刚才意识到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}
它的文档还说"字典在计算显示之前按键排序" 。但为什么它也不排序?对我来说并不好看。有没有办法使它排序集?同样在嵌套结构中,因为它是pprint
的主要目的。
答案 0 :(得分:4)
这是在issue 27495中提出的,这是一个错误,而不仅仅是一个设计选择,但显然还没有得到解决。
这个问题的另一个例子可能更明显地说明了你在Python 3中识别的行为:
>>> import string, pprint >>> pprint.pprint(set(string.digits)) {'7', '1', '9', '8', '3', '0', '2', '5', '6', '4'}
同样适用于frozenset()
,但请注意,多行pprint
输出 在Python 3中排序,例如:
>>> pprint.pprint(set(string.digits), width=1) {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
但是,在Python 2中,相同原始代码的输出已排序:
>>> pprint.pprint(set(string.digits)) set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
我认为这是Python 3和Python 2之间的不一致,并且在单行多行行为之间,这使得这个错误。
对于dict
,一个类似的例子,如你所说,输出在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}
但是,对于Python 3.6,pprint
排序dict
以来pprint
可能会令人感到惊讶。are ordered now但是,由于这只是一个实现细节(目前),我认为pprint
没有义务维护插入顺序(这样做),这样做会破坏dict
在Python中自身的一致性总是排序Tkt Id | Travel route | Meal selected 1 | Food selected 1
Tkt Id | Travel route | Meal selected 2 | Food selected 2
的版本。