我正在使用默认字典。我需要pprint
。
然而,当我pprint
时......这就是它的样子。
defaultdict(<functools.partial object at 0x1f68418>, {u'300:250': defaultdict(<functools.partial object at 0x1f683c0>, {0: defaultdict(<type 'list'>, {u'agid1430864021': {u'status': u'0', u'exclude_regi..........
如何让pprint
使用默认字典?
答案 0 :(得分:35)
我之前使用pprint(dict(defaultdict))
作为解决方法。
答案 1 :(得分:19)
我发现的最好的解决方案是一个黑客,但是一个优雅的解决方案(如果一个黑客可以):
class PrettyDefaultDict(collections.defaultdict):
__repr__ = dict.__repr__
然后使用PrettyDefaultDict
类而不是collections.defaultdict
。它的工作原理是因为pprint模块的工作方式(至少在2.7上):
r = getattr(typ, "__repr__", None)
if issubclass(typ, dict) and r is dict.__repr__:
# follows pprint dict formatting
通过这种方式,我们“欺骗”pprint,认为我们的字典类就像普通dict
一样。
答案 2 :(得分:10)
如果您不必使用pprint
,则可以使用json
来打印defaultdict
:
print(json.dumps(my_default_dict, indent=4))
这也适用于嵌套的默认值。
答案 3 :(得分:4)
与Jon Clements的回答一样,如果这是您的常用操作,您可以考虑将defaultdict子类化为覆盖其repr方法,如下所示。
<强>输入:强>
from collections import defaultdict
class prettyDict(defaultdict):
def __init__(self, *args, **kwargs):
defaultdict.__init__(self,*args,**kwargs)
def __repr__(self):
return str(dict(self))
foo = prettyDict(list)
foo['bar'].append([1,2,3])
foo['foobar'].append([4,5,6,7,8])
print(foo)
<强>输出:强>
{'foobar': [[4, 5, 6, 7, 8]], 'bar': [[1, 2, 3]]}
答案 4 :(得分:3)
我真的很喜欢这个解决嵌套默认设置的解决方案。这有点像黑客攻击,但在pdbing时整齐地完成工作:
import json
data_as_dict = json.loads(json.dumps(data_as_defaultdict))
print(data_as_dict)