41

我正在使用默认字典。我需要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使用默认字典?

4

5 回答 5

44

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

于 2012-10-16T23:38:38.080 回答
24

我发现的最好的解决方案是有点破解,但是一个优雅的(如果破解可以的话):

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.

于 2013-08-22T09:29:59.223 回答
17

如果您不必使用pprint,则可以使用json漂亮打印defaultdict

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

这也适用于嵌套的默认字典。

于 2016-01-19T18:06:34.453 回答
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]]}
于 2012-10-17T00:04:29.260 回答
4

我真的很喜欢这种处理嵌套默认字典的解决方案。这有点像黑客,但在 pdbing 时可以很好地完成工作:

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

来自:https ://stackoverflow.com/a/32303615/4526633

于 2016-01-02T03:26:33.277 回答