使用pprint并跳过类型

2024-06-01 20:49:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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?


Tags: id示例类型列表ordereddictpprintocsgx
3条回答
>>> 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,我认为这看起来足够干净了

如果只是为了打印一些dictlist的内容(或从它们继承的类中的内容),最好使用其他序列化,例如JSON:

import json
print json.dumps(obj)

您需要创建自己的^{} 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'))]

相关问题 更多 >