以紧凑的方式打印大型嵌套字典的结构,而无需打印所有元素

Cen*_*tAu 5 python printing dictionary

我有一个大的嵌套字典,我想在每个级别打印其结构和一个样本元素.

例如:

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'}
Run Code Online (Sandbox Code Playgroud)

如果我使用相当打印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'},
Run Code Online (Sandbox Code Playgroud)

是否有内置方式或库只显示每个级别中的少数顶级元素,并代表其余部分以'...'紧凑的方式显示整个字典?像下面这样的东西('...'也是要打印的):

每个级别只有1个示例的所需输出:

{'key0': {
  'subkey0': {
    'var1: 'value1', 
    '...'
    },
  '...'
  },
  '...'
}
Run Code Online (Sandbox Code Playgroud)

对于列表,我找到了这个解决方案,但是我找不到嵌套字典的任何内容.

Sup*_*Man 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 + "}")
Run Code Online (Sandbox Code Playgroud)

这个嵌套函数只是迭代它找到的任何字典,并继续忽略它抓取的第一个项目。您可以使用 来添加对列表的处理elif isinstance(value, list),同样也可以对其他类型进行处理。

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

{
'key9': {
 'subkey10': {
  'var1': 'value1',
  '...'
  }
 '...'
 }
'...'
}
Run Code Online (Sandbox Code Playgroud)