gpt4 book ai didi

python - pprint 排序字典而不是集合?

转载 作者:太空狗 更新时间:2023-10-29 20:28:05 28 4
gpt4 key购买 nike

我知道口述和集合没有顺序,所以相等的集合或口述可能打印不同(所有测试使用 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,pprintdict 进行排序可能会令人惊讶,因为它们是 are ordered now .然而,由于这只是一个实现细节(目前),我想 pprint 没有义务维护插入顺序(目前),这样做会破坏 pprint始终对 dict 进行排序的 Python 版本之间的一致性。

关于python - pprint 排序字典而不是集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45016455/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com