我知道口述和集合没有顺序,所以相等的集合或口述可能打印不同(所有测试使用 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
(“pretty-print”) 对字典进行排序但不对集合进行排序:
>>> 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
的主要目的。
最佳答案
这是在 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
进行排序可能会令人惊讶,因为它们是 are ordered now .然而,由于这只是一个实现细节(目前),我想 pprint
没有义务维护插入顺序(目前),这样做会破坏 pprint
始终对 dict
进行排序的 Python 版本之间的一致性。
关于python - pprint 排序字典而不是集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45016455/