我有一个多级嵌套字典,每当字典中有type个键时,就try 添加一个键required.

Code:

def add_recursively(val):
   if 'type' in val and val['type'] != 'object':
      val['required'] = False
      return val
   elif 'type' in val and val['type'] == 'object' and 'object_schema' in val:
      return add_recursively(val['object_schema'])
   else:
     val['required'] = False
     return val

new_data = {}
for key, value in data.items():
    if value['type'] == 'object' and 'object_schema' in value:
       new_data[key] = add_recursively(value)
    else:
       value['required'] = False
       new_data[key] = value

Input data:

data = {'key1': {'description': 'Configuration for OpenID', 'type': 'boolean'},
 'key2': {'default': {'enabled': True, 'logging_percent': 100},
  'object_schema': {'enabled': {'default': True, 'type': 'boolean'},
   'logging_percent': {'default': 100, 'type': 'float'},
   'nested_key': {'default': {'new_enable': True, 'new_precent': 100},
    'object_schema': {'new_enable': {'default': True, 'type': 'boolean'},
     'new_precent': {'default': 100, 'type': 'float'}},
    'type': 'object'}},
  'type': 'object'}}

Output data:

{'key1': {'description': 'Configuration for OpenID',
  'required': False,
  'type': 'boolean'},
 'key2': {'enabled': {'default': True, 'type': 'boolean'},
  'logging_percent': {'default': 100, 'type': 'float'},
  'nested_key': {'default': {'new_enable': True, 'new_precent': 100},
   'object_schema': {'new_enable': {'default': True, 'type': 'boolean'},
    'new_precent': {'default': 100, 'type': 'float'}},
   'type': 'object'},
  'required': False}}

Expected output:

{'key1': {
  'required': False,
  'description': 'Configuration for OpenID',
  'type': 'boolean'},
 'key2': {
     'required': False,
     'enabled': {'required': False, 'default': True, 'type': 'boolean'},
    'logging_percent': {'required': False, 'default': 100, 'type': 'float'},
    'nested_key': {'default': {'new_enable': True, 'new_precent': 100},
    'object_schema': {'new_enable': {'required': False, 'default': True, 'type': 'boolean'},
      'new_precent': {'required': False, 'default': 100, 'type': 'float'}},
    'type': 'object'},
    }}

推荐答案

这里有一种修改data的方法,通过向每个包含type个键的键添加required个键:

def add_required(d):
    if 'type' in d:
        d['required'] = False
    for v in d.values():
        if isinstance(v, dict):
            add_required(v)
add_required(data)

输出:

>>> data
{'key1': {'description': 'Configuration for OpenID',
  'type': 'boolean',
  'required': False},
 'key2': {'default': {'enabled': True, 'logging_percent': 100},
  'object_schema': {'enabled': {'default': True,
    'type': 'boolean',
    'required': False},
   'logging_percent': {'default': 100, 'type': 'float', 'required': False},
   'nested_key': {'default': {'new_enable': True, 'new_precent': 100},
    'object_schema': {'new_enable': {'default': True,
      'type': 'boolean',
      'required': False},
     'new_precent': {'default': 100, 'type': 'float', 'required': False}},
    'type': 'object',
    'required': False}},
  'type': 'object',
  'required': False}}

Python相关问答推荐

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

为什么默认情况下所有Python类都是可调用的?

我如何根据前一个连续数字改变一串数字?

Pandas Loc Select 到NaN和值列表

在单个对象中解析多个Python数据帧

为什么\b在这个正则表达式中不解释为反斜杠

当条件满足时停止ODE集成?

在用于Python的Bokeh包中设置按钮的样式

从一个df列提取单词,分配给另一个列

如何求相邻对序列中元素 Select 的最小代价

如何训练每一个pandaprame行的线性回归并生成斜率

PYTHON中的pd.wide_to_long比较慢

上传文件并使用Panda打开时的Flask 问题

Matplotlib中的曲线箭头样式

如何将列表从a迭代到z-以抓取数据并将其转换为DataFrame?

如何在Polars中处理用户自定义函数的多行结果?

try 使用RegEx解析由标识多行文本数据的3行头组成的日志(log)文件

对列中的数字进行迭代,得到n次重复开始的第一个行号

如何将参数名作为参数传入到函数中?