首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pprint漂亮地打印OrderedDicts

使用pprint漂亮地打印OrderedDicts
EN

Stack Overflow用户
提问于 2014-01-29 01:17:27
回答 4查看 5.1K关注 0票数 0

我正在使用pprint很好地打印一个dict,它运行良好。现在,我从模块OrderedDict切换到使用collections。不幸的是,pprint路由似乎没有认识到这类对象或多或少也是dict的,因此返回到打印这一行。

代码语言:javascript
复制
>>> d = { i:'*'*i for i in range(8) }
>>> pprint.pprint(d)
{0: '',
 1: '*',
 2: '**',
 3: '***',
 4: '****',
 5: '*****',
 6: '******',
 7: '*******'}
>>> pprint.pprint(collections.OrderedDict(d))
OrderedDict([(0, ''), (1, '*'), (2, '**'), (3, '***'), (4, '****'), (5, '*****'), (6, '******'), (7, '*******')])

有什么方法也能更好地表示OrderedDicts吗?也许即使它们嵌套在正常的dictlist中。

EN

回答 4

Stack Overflow用户

发布于 2016-12-22 21:04:51

我找到了一个相对简单的解决方案,但它包含了使有序字典的输出看起来与常规dict对象完全相同的风险。

使用上下文管理器防止pprint对字典键排序的最初解决方案来自这个答案

代码语言:javascript
复制
@contextlib.contextmanager
def pprint_OrderedDict():
    pp_orig = pprint._sorted
    od_orig = OrderedDict.__repr__
    try:
        pprint._sorted = lambda x:x
        OrderedDict.__repr__ = dict.__repr__
        yield
    finally:
        pprint._sorted = pp_orig
        OrderedDict.__repr__ = od_orig

(您也可以使用OrderedDict.__repr__方法修补dict.__repr__,但请不要。)

示例:

代码语言:javascript
复制
>>> foo = [('Roger', 'Owner'), ('Diane', 'Manager'), ('Bob', 'Manager'),
...        ('Ian', 'Associate'), ('Bill', 'Associate'), ('Melinda', 'Associate')]

>>> d = OrderedDict(foo)
>>> pprint.pprint(d)
OrderedDict([('Roger', 'Owner'), ('Diane', 'Manager'), ('Bob', 'Manager'), ('Ian', 'Associate'), ('Bill', 'Associate'), ('Melinda', 'Associate')])

>>> pprint.pprint(dict(d))
{'Bill': 'Associate',
 'Bob': 'Manager',
 'Diane': 'Manager',
 'Ian': 'Associate',
 'Melinda': 'Associate',
 'Roger': 'Owner'}

>>> with pprint_OrderedDict():
...     pprint.pprint(d)
...
{'Roger': 'Owner',
 'Diane': 'Manager',
 'Bob': 'Manager',
 'Ian': 'Associate',
 'Bill': 'Associate',
 'Melinda': 'Associate'}
票数 3
EN

Stack Overflow用户

发布于 2014-01-29 01:23:33

试穿这个:

d = collections.OrderedDict({ i:'*'*i for i in range(8) })

编辑

pprint.pprint(list(d.items()))

票数 2
EN

Stack Overflow用户

发布于 2016-12-22 22:07:22

如果您专门针对CPython* 3.6或更高版本,那么您可以使用只要用普通字典就行而不是OrderedDict。您可能会错过一些OrderedDict,而且这还不能保证可以移植到其他实现中,但是这可能是完成您所要做的事情的最简单的方法。

* CPython是python.org的参考实现,可以从python.org下载。

** CPython 从PyPy那里剽窃了这个想法,所以您可能也可以依赖它在那里工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21420243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档