2013-04-09 79 views
2

我想用pprint打印一些複雜的列表,請參閱下面的例子:使用pprint和跳過類型命名

>>> x = [OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]), OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]), OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]), OrderedDict([(u'D-ID', u'gx-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'ocs-1'), (u'R', u'31735')]), OrderedDict([(u'D-ID', u'ocs-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'pcc-gx-1'), (u'R', u'46351')]), OrderedDict([(u'D-ID', u'rgx-1'), (u'R', u'907')]), OrderedDict([(u'D-ID', u'rgx-2'), (u'R', u'1010')]), OrderedDict([(u'D-ID', u'rocs-1'), (u'R', u'915')]), OrderedDict([(u'D-ID', u'rocs-2'), (u'R', u'1033')])] 
>>> pprint.pprint(x) 
[OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]), 
OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]), 
OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]), 
OrderedDict([(u'D-ID', u'gx-2'), (u'R', u'0')]), 
OrderedDict([(u'D-ID', u'ocs-1'), (u'R', u'31735')]), 
OrderedDict([(u'D-ID', u'ocs-2'), (u'R', u'0')]), 
OrderedDict([(u'D-ID', u'pcc-gx-1'), (u'R', u'46351')]), 
OrderedDict([(u'D-ID', u'rgx-1'), (u'R', u'907')]), 
OrderedDict([(u'D-ID', u'rgx-2'), (u'R', u'1010')]), 
OrderedDict([(u'D-ID', u'rocs-1'), (u'R', u'915')]), 
OrderedDict([(u'D-ID', u'rocs-2'), (u'R', u'1033')])] 

這是好的,但我想刪除所有類型的域名(OrderedDict & u)和所有不必要的[]pprint可以嗎?

+0

爲什麼你需要這樣做? – jamylak 2013-04-09 11:06:53

+0

@jamylak我只需要打印的數據結構,如上述,以及跳過類型和[]是使輸出更小的好方法! – theAlse 2013-04-09 11:09:13

+0

'json.dumps'如何? – Boldewyn 2013-04-09 11:25:46

回答

2

你需要創建自己的pprint.PrettyPrinter class的子類,並覆蓋.format()方法:

from pprint import PrettyPrinter, _recursion 

class MyPrettyPrinter(PrettyPrinter): 
    def format(self, object, context, maxlevels, level): 
     if isinstance(object, OrderedDict): 
      if not object: 
       return "()", True, False 

      objid = id(object) 
      if maxlevels and level >= maxlevels: 
       return "(...)", False, objid in context 
      if objid in context: 
       return _recursion(object), False, True 
      context[objid] = 1 
      readable = True 
      recursive = False 
      components = [] 
      append = components.append 
      level += 1 
      selfformat = self.format 
      for k, v in sorted(object.items()): 
       krepr, kreadable, krecur = selfformat(k, context, maxlevels, level) 
       vrepr, vreadable, vrecur = selfformat(v, context, maxlevels, level) 
       append('({}, {})'.format(krepr, vrepr)) 
       readable = readable and kreadable and vreadable 
       if krecur or vrecur: 
        recursive = True 
      del context[objid] 
      return '({})'.format(', '.join(components)), readable, recursive 

     formatted, readable, recursion = PrettyPrinter.format(self, object, context, maxlevels, level) 
     if isinstance(object, unicode): 
      formatted = formatted.lstrip('u') 

     return formatted, readable, recursion 

我們讓基類做的大部分工作,並只能格式化OrderedDict明確;它有一個自定義的__repr__這意味着原來的pprint實現只是使用它,而不是遞歸它。

然後使用這個類,而不是直接調用來pprint.pprint()

mypprint = MyPrettyPrinter() 

mypprint.pprint(x) 

這將產生:

>>> mypprint = MyPrettyPrinter() 
>>> mypprint.pprint(x) 
[(('D-ID', 'clci-2'), ('R', '1691')), 
(('D-ID', 'dallas-pcc-1'), ('R', '5498')), 
(('D-ID', 'gx-1'), ('R', '2275')), 
(('D-ID', 'gx-2'), ('R', '0')), 
(('D-ID', 'ocs-1'), ('R', '31735')), 
(('D-ID', 'ocs-2'), ('R', '0')), 
(('D-ID', 'pcc-gx-1'), ('R', '46351')), 
(('D-ID', 'rgx-1'), ('R', '907')), 
(('D-ID', 'rgx-2'), ('R', '1010')), 
(('D-ID', 'rocs-1'), ('R', '915')), 
(('D-ID', 'rocs-2'), ('R', '1033'))] 
+0

我喜歡這個想法,但我不認爲這會拿起「內部」的Unicode字符串,如你的輸出。 – DSM 2013-04-09 11:41:11

+0

@DSM:Urm,它沒有遞歸。詛咒,所以我們需要緩解自我,更新。 – 2013-04-09 11:41:50

+0

@DSM:更好;由於自定義'__repr__' pprint只會使用它而不是遞歸遍歷它。 – 2013-04-09 11:57:21

0
>>> import pprint 
>>> from collections import OrderedDict 
>>> x = [OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]), OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]), OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]), OrderedDict([(u'D-ID', u'gx-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'ocs-1'), (u'R', u'31735')]), OrderedDict([(u'D-ID', u'ocs-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'pcc-gx-1'), (u'R', u'46351')]), OrderedDict([(u'D-ID', u'rgx-1'), (u'R', u'907')]), OrderedDict([(u'D-ID', u'rgx-2'), (u'R', u'1010')]), OrderedDict([(u'D-ID', u'rocs-1'), (u'R', u'915')]), OrderedDict([(u'D-ID', u'rocs-2'), (u'R', u'1033')])] 
>>> print pprint.pformat(x).replace("OrderedDict([", "(") \ 
          .replace("u'", "'") \ 
          .replace("])", ")") 

[(('D-ID', 'clci-2'), ('R', '1691')), 
(('D-ID', 'dallas-pcc-1'), ('R', '5498')), 
(('D-ID', 'gx-1'), ('R', '2275')), 
(('D-ID', 'gx-2'), ('R', '0')), 
(('D-ID', 'ocs-1'), ('R', '31735')), 
(('D-ID', 'ocs-2'), ('R', '0')), 
(('D-ID', 'pcc-gx-1'), ('R', '46351')), 
(('D-ID', 'rgx-1'), ('R', '907')), 
(('D-ID', 'rgx-2'), ('R', '1010')), 
(('D-ID', 'rocs-1'), ('R', '915')), 
(('D-ID', 'rocs-2'), ('R', '1033'))] 

調整replace s到你的需求,我認爲這看起來不夠乾淨

0

如果只是打印一些dictlist的東西(或東西從類從中繼承),你會過得更好使用一些其他的系列化,如JSON:

import json 
print json.dumps(obj) 
+0

隨着其它類型的字典'縮進= 0'新線 – jamylak 2013-04-09 13:13:33

+0

我已經使用json.dumps,輸出比不幸醜陋pprint。 – theAlse 2013-04-09 13:24:23