pprint 排序字典而不是集合?
pprint sorting dicts but not sets?
我知道口述和集合没有顺序,所以相等的集合或口述可能打印不同(所有测试 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}
它的文档还说 "Dictionaries are sorted by key before the display is computed"。但为什么它不对集合进行排序呢?对我来说似乎不漂亮。有没有办法让它 对集合进行排序?同样在嵌套结构中,因为这是 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
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}
然而,对于 Python 3.6,pprint
对 dict
进行排序可能被认为是令人惊讶的,因为它们 。然而,由于这只是一个实现细节(目前),我想 pprint
没有义务维护插入顺序(目前),这样做会破坏 pprint
在 Python 总是排序的版本 dict
s.
我知道口述和集合没有顺序,所以相等的集合或口述可能打印不同(所有测试 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}
它的文档还说 "Dictionaries are sorted by key before the display is computed"。但为什么它不对集合进行排序呢?对我来说似乎不漂亮。有没有办法让它 对集合进行排序?同样在嵌套结构中,因为这是 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
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}
然而,对于 Python 3.6,pprint
对 dict
进行排序可能被认为是令人惊讶的,因为它们 pprint
没有义务维护插入顺序(目前),这样做会破坏 pprint
在 Python 总是排序的版本 dict
s.