当前位置: 首页 > 面试题库 >

Python漂亮的列表打印字典,缩写长列表

范霄
2023-03-14
问题内容

我有一个列表字典,列表很长。如何以仅显示列表中几个元素的方式打印它?显然,我可以为此编写一个自定义函数,但是是否有任何内置方法或库可以实现此目的?例如,当打印较大的数据帧时,pandas可以在短时间内很好地打印出来。

这个例子更好地说明了我的意思:

obj = {'key_1': ['EG8XYD9FVN',
  'S2WARDCVAO',
  'J00YCU55DP',
  'R07BUIF2F7',
  'VGPS1JD0UM',
  'WL3TWSDP8E',
  'LD8QY7DMJ3',
  'J36U3Z9KOQ',
  'KU2FUGYB2U',
  'JF3RQ315BY'],
 'key_2': ['162LO154PM',
  '3ROAV881V2',
  'I4T79LP18J',
  'WBD36EM6QL',
  'DEIODVQU46',
  'KWSJA5WDKQ',
  'WX9SVRFO0G',
  '6UN63WU64G',
  '3Z89U7XM60',
  '167CYON6YN']}

所需的输出:

{'key_1':
    ['EG8XYD9FVN', 'S2WARDCVAO', '...'],
 'key_2':
    ['162LO154PM', '3ROAV881V2', '...']
}

问题答案:

如果不是为了美观的打印,那么该reprlib模块将成为解决问题的方法:它是为深度嵌套和递归/自引用数据结构的安全,优雅和可自定义的处理而设计的。

但是,事实证明,将reprlibpprint模块组合起来并非易事,至少在不破坏某些漂亮印刷方面的前提下,我无法提出一种简洁的方法。

因此,这是一个解决方案,仅PrettyPrinter在需要时才将其分类为裁剪/缩写列表:

from pprint import PrettyPrinter


obj = {
    'key_1': [
        'EG8XYD9FVN', 'S2WARDCVAO', 'J00YCU55DP', 'R07BUIF2F7', 'VGPS1JD0UM',
        'WL3TWSDP8E', 'LD8QY7DMJ3', 'J36U3Z9KOQ', 'KU2FUGYB2U', 'JF3RQ315BY',
    ],
    'key_2': [
        '162LO154PM', '3ROAV881V2', 'I4T79LP18J', 'WBD36EM6QL', 'DEIODVQU46',
        'KWSJA5WDKQ', 'WX9SVRFO0G', '6UN63WU64G', '3Z89U7XM60', '167CYON6YN',
    ],
    # Test case to make sure we didn't break handling of recursive structures
    'key_3': [
        '162LO154PM', '3ROAV881V2', [1, 2, ['a', 'b', 'c'], 3, 4, 5, 6, 7],
        'KWSJA5WDKQ', 'WX9SVRFO0G', '6UN63WU64G', '3Z89U7XM60', '167CYON6YN',
    ]
}


class CroppingPrettyPrinter(PrettyPrinter):

    def __init__(self, *args, **kwargs):
        self.maxlist = kwargs.pop('maxlist', 6)
        return PrettyPrinter.__init__(self, *args, **kwargs)

    def _format(self, obj, stream, indent, allowance, context, level):
        if isinstance(obj, list):
            # If object is a list, crop a copy of it according to self.maxlist
            # and append an ellipsis
            if len(obj) > self.maxlist:
                cropped_obj = obj[:self.maxlist] + ['...']
                return PrettyPrinter._format(
                    self, cropped_obj, stream, indent,
                    allowance, context, level)

        # Let the original implementation handle anything else
        # Note: No use of super() because PrettyPrinter is an old-style class
        return PrettyPrinter._format(
            self, obj, stream, indent, allowance, context, level)


p = CroppingPrettyPrinter(maxlist=3)
p.pprint(obj)

输出maxlist=3

{'key_1': ['EG8XYD9FVN', 'S2WARDCVAO', 'J00YCU55DP', '...'],
 'key_2': ['162LO154PM',
           '3ROAV881V2',
           [1, 2, ['a', 'b', 'c'], '...'],
           '...']}

输出为maxlist=5(触发将列表分成几行):

{'key_1': ['EG8XYD9FVN',
           'S2WARDCVAO',
           'J00YCU55DP',
           'R07BUIF2F7',
           'VGPS1JD0UM',
           '...'],
 'key_2': ['162LO154PM',
           '3ROAV881V2',
           'I4T79LP18J',
           'WBD36EM6QL',
           'DEIODVQU46',
           '...'],
 'key_3': ['162LO154PM',
           '3ROAV881V2',
           [1, 2, ['a', 'b', 'c'], 3, 4, '...'],
           'KWSJA5WDKQ',
           'WX9SVRFO0G',
           '...']}

笔记:

  • 这将创建列表的 副本 。根据数据结构的大小,这在内存使用方面可能非常昂贵。
  • 这仅处理 列表 的特殊情况。为了使该类具有通用性,必须为字典,元组,集合,frozensets等实现等效行为。


 类似资料:
  • 问题内容: 是否有一种简单的内置方法将2D Python列表打印为2D矩阵? 所以这: 会变成像 我找到了pprint模块,但是它似乎并没有实现我想要的功能。 问题答案: 为了使事情变得有趣,让我们尝试使用更大的矩阵: 输出: UPD:对于多行单元格,应如下所示: 然后应用上面的代码。 另请参见http://pypi.python.org/pypi/texttable

  • 问题内容: 如果有人对JSON的打印非常了解,那么我将不胜感激! 我正在使用以下功能将JSON字符串移动到文件中,以将复杂的python字符串转换为JSON格式: 问题是我遇到了方括号的语法错误,因为这对我来说是个新话题,我不知道该如何解决。我需要的JSON格式如下: 我正在使用Google Visualization API,您可能对此比较熟悉,但是我需要动态图。上面的代码是API创建图形所需的

  • 问题内容: 我在终端上经常使用和。系列的默认值返回精简的样本,具有一些头和尾值,但其余部分丢失。 有没有一种内置方法可以漂亮地打印整个?理想情况下,它将支持适当的对齐方式,可能会支持列之间的边界,甚至可能会为不同的列进行颜色编 问题答案: 你也可以将,与一个或多个选项一起使用: 这将使选项自动返回其先前的值。 如果你正在使用,则使用代替将使用丰富的显示逻辑(像这样)。

  • 我的任务是: 制作几本字典,每本字典的名字都是一只宠物的名字。在每本字典中,包括动物的种类和主人的名字。将这些字典存储在一个名为宠物的列表中。接下来,循环浏览你的列表,然后打印你所知道的关于每只宠物的一切。 到目前为止我所拥有的: 迄今为止的产出: 宠物名称:类型:狗宠物主人:乔 宠物名称:类型:猫宠物主人:盖尔 宠物名称:类型:鸟宠物主人:保罗 宠物名称:类型:蛇宠物主人:斯坦 我的问题: 我需

  • 问题内容: 我想打印NumPy表格数组数据,使其看起来不错。R和数据库控制台似乎表现出了很好的能力。但是,NumPy内置的表格数组打印看起来像垃圾: 我想要的东西看起来更像数据库吐出来的东西,例如postgres-style: 是否有任何好的第三方Python库来格式化美观的ASCII表? 我正在使用Python 2.5,NumPy 1.3.0。 问题答案: 我似乎有与prettytable良好的

  • 问题内容: 如何在Python中打印深度约为4的字典?我尝试使用进行漂亮的打印,但是没有用: 我只是想为每个嵌套添加一个缩进(),以便获得如下内容: 等等 我怎样才能做到这一点? 问题答案: 我不确定您希望格式看起来如何,但是可以从这样的函数开始: