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

标签 python python-3.x dictionary set pprint

我知道口述和集合没有顺序,所以相等的集合或口述可能打印不同(所有测试使用 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/

相关文章:

python - 为什么我的 sklearn 自定义转换器在 ColumnTransformer 中使用时不保存属性?

python - django 表单未验证

具有长时间运行计时器的 Python 线程意外退出

c++ - std::map:只使用keytype的一部分进行比较查找

Python:如何从字符数据流中生成整数?

python - 如何以字符串格式编写多行函数?

python - 试图了解这个潜在病毒加密的 pyw 文件

python - 检查python中矩阵中接近元素的值

java stream List<Map<String,Double>> 需要根据字符串取平均值

python - 需要从字典列表中删除重复项并更改剩余重复项的数据(python)