我正在使用pprint很好地打印一个dict,它运行良好。现在,我从模块OrderedDict切换到使用collections。不幸的是,pprint路由似乎没有认识到这类对象或多或少也是dict的,因此返回到打印这一行。
>>> 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吗?也许即使它们嵌套在正常的dict或list中。
发布于 2016-12-22 21:04:51
我找到了一个相对简单的解决方案,但它包含了使有序字典的输出看起来与常规dict对象完全相同的风险。
使用上下文管理器防止pprint对字典键排序的最初解决方案来自这个答案。
@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__,但请不要。)
示例:
>>> 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'}发布于 2014-01-29 01:23:33
试穿这个:
d = collections.OrderedDict({ i:'*'*i for i in range(8) })
编辑
pprint.pprint(list(d.items()))
发布于 2016-12-22 22:07:22
如果您专门针对CPython* 3.6或更高版本,那么您可以使用只要用普通字典就行而不是OrderedDict。您可能会错过一些OrderedDict,而且这还不能保证可以移植到其他实现中,但是这可能是完成您所要做的事情的最简单的方法。
* CPython是python.org的参考实现,可以从python.org下载。
** CPython 从PyPy那里剽窃了这个想法,所以您可能也可以依赖它在那里工作。
https://stackoverflow.com/questions/21420243
复制相似问题