以简洁的方式打印大型嵌套字典的结构,而不需要打印所有元素。

8

我有一个大的嵌套字典,想打印出其结构以及每个层级的一个示例元素。

例如:

from collections import defaultdict
nested = defaultdict(dict)
for i in range(10):
  for j in range(20):
    nested['key'+str(i)]['subkey'+str(j)] = {'var1': 'value1', 'var2': 'value2'}

如果我使用pprint进行漂亮的打印,将得到所有元素,这非常长,输出的一部分将如下所示:
from pprint import pprint
pprint(nested)

        {'key0': {'subkey0': {'var1': 'value1', 'var2': 'value2'},
          'subkey1': {'var1': 'value1', 'var2': 'value2'},
          'subkey10': {'var1': 'value1', 'var2': 'value2'},
          'subkey11': {'var1': 'value1', 'var2': 'value2'},
          'subkey12': {'var1': 'value1', 'var2': 'value2'},
          'subkey13': {'var1': 'value1', 'var2': 'value2'},
          'subkey14': {'var1': 'value1', 'var2': 'value2'},

有没有内置的方法或库可以在每个级别中仅显示少量顶级元素,并用'...'表示其余部分,以紧凑的方式显示整个字典?类似以下内容('...'也要打印出来):
只在每个级别显示1个示例的期望输出:
{'key0': {
  'subkey0': {
    'var1: 'value1', 
    '...'
    },
  '...'
  },
  '...'
}

对于列表,我发现了这个解决方案,但是我没有找到任何关于嵌套字典的解决方案。
1个回答

3

一种基本的解决方案是设置一个嵌套函数,该函数将循环并检测要打印的值,仅打印每个值中找到的第一个项。由于字典没有排序,这意味着它将随机选择一个。因此,如果您希望智能地区分不同类型的示例,则目标本质上是复杂的。

但是以下是基本函数的工作方式:

def compact_print(d, indent=''):
    items = d.items()
    key, value = items[0]
    if not indent:
        print("{")

    if isinstance(value, dict):
        print(indent + "'{}': {{".format(key))
        compact_print(value, indent + ' ')
        print(indent + "'...'")
    else:
        print(indent + "'{}': '{}',".format(key, value))
        print(indent + "'...'")
    print(indent + "}")

这个嵌套函数遍历任何字典并继续忽略它抓取的第一项之后。你可以添加一个处理列表的elif isinstance(value, list),同样也适用于其他类型。

对于你的示例输入,它生成以下内容:

{
'key9': {
 'subkey10': {
  'var1': 'value1',
  '...'
  }
 '...'
 }
'...'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接