Python和默认字典,如何美观地打印(pprint)?

43

我正在使用默认字典(default dict),我需要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与默认字典一起工作?

5个回答

45

我以前曾使用过pprint(dict(defaultdict))作为一种解决方法。


22
如果对象是一个嵌套的defaultdict对象层次结构,我发现该解决方案无法产生预期效果。 - krd
5
对于嵌套的defaultdicts,使用以下代码进行格式化输出:pprint({k: dict(v) for k, v in dict(group_ids).items()}) - user1472229

25
我发现的最佳解决方案有点瑕疵,但是它却很优雅(如果一个hack可以这样说的话)。
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一样。

@rossoft 在告诉我们可以这样做之前,你是否真的测试过这个建议(defaultdict.__repr__ = dict.__repr__)? - Russia Must Remove Putin
@Aaron Hall:在Python 2.7上对我起作用了。如果你遇到了问题,请告诉我们具体是什么问题。 - mhsmith
1
@mhsmith 我的问题是针对 rossoft 的,他可能已经删除了他的消息。但 RedGlow 的代码可以使用演示。 - Russia Must Remove Putin
1
啊,是的,我显然不建议对defaultdict本身进行猴子补丁。 - mhsmith

18

如果您不必使用pprint,您可以使用json来对defaultdict进行漂亮的打印:

print(json.dumps(my_default_dict, indent=4))

这也适用于嵌套的defaultdict。


1
如果您的键不是字符串,这将会破坏您的打印输出。 - Mugen

5

我非常喜欢这个解决方案,用于处理嵌套的defaultdicts。虽然有点hack,但在调试时可以整洁地完成工作:

import json
data_as_dict = json.loads(json.dumps(data_as_defaultdict))
print(data_as_dict)

来源:https://dev59.com/l2Ij5IYBdhLWcg3wRjSr#32303615

这是一个关于IT技术的问题。

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]]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接