2012-10-16 92 views
26

我使用默認字典。我需要pprintPython和默認字典,如何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使用默認字典?

回答

33

我以前使用過pprint(dict(defaultdict))作爲解決方法。

+13

我發現如果對象是deafultdict對象的嵌套層次結構,此解決方案不會產生期望的效果。 – krd

+3

對於嵌套的defaultdicts:'pprint({k:dict(v)for k,v in dict(group_ids).items()})' – bartekbrak

+0

@ user35186似乎不起作用:/ –

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

我已經找到了最好的解決方案是一個黑客位的,但優雅的一個(如果一個黑客可以永遠be):

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

+0

@rossoft是否真的測試過在告訴我們我們可以這樣做之前,有一點建議('defaultdict .__ repr__ = dict .__ repr__')? –

+0

@Aaron Hall:它在Python 2.7上爲我工作。如果你有問題,告訴我們它是什麼。 – mhsmith

+0

@ mhsmith我的問題發給rossoft,他必須刪除他的信息。但是,RedGlow的代碼可以使用演示。 –

2

我真的很喜歡這個解決方案來處理嵌套的defaultdicts。這是一個黑客攻擊的一位,但很整潔做這項工作pdbing時:

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

來源:https://stackoverflow.com/a/32303615/4526633

7

如果你沒有使用pprint,您可以使用json到漂亮地打印的defaultdict

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

這也適用於嵌套的defaultdicts。

+0

太棒了,非常感謝! –