用Pythonic方式转换含嵌套列表字典的JSON 实现高效查找
方案1:使用glom实现链式转换
glom非常适合处理这种嵌套结构的批量转换,代码非常简洁,嵌套层级再多也不需要写多层循环:
首先引入依赖:
from glom import glom, Assign, T, Merge
定义通用的列表转字典规则:
def list_to_map(index_key: str): # 输入列表,输出以index_key为键的字典,自动删除冗余的index_key字段 return Merge([{T[index_key]: T.omit(index_key)}])
即可快速完成转换:
# 先转换外层symbols列表 J['symbols'] = glom(J['symbols'], list_to_map('symbol')) # 再转换每个symbol下的filters列表 for v in J['symbols'].values(): v['filters'] = glom(v['filters'], list_to_map('filterType'))
比手动实现可读性更高,也避免了自己写删除逻辑的潜在问题。
方案2:纯Python递归优化实现
如果不想引入第三方依赖,可以把你原来的flatten函数扩展成递归版本,适配任意嵌套深度的场景:
def deep_flatten(obj: dict, list_index_map: dict) -> dict: """ list_index_map: 配置需要转换的列表字段名对应的索引键 示例传入: {'symbols': 'symbol', 'filters': 'filterType'} """ result = {} for k, v in obj.items(): if isinstance(v, list) and k in list_index_map: index_key = list_index_map[k] flattened_map = {} for item in v: # 如果需要保留原始数据,可加一行 item = item.copy() item_key = item.pop(index_key) # 递归处理当前项内部的嵌套结构 flattened_map[item_key] = deep_flatten(item, list_index_map) result[k] = flattened_map elif isinstance(v, dict): result[k] = deep_flatten(v, list_index_map) else: result[k] = v return result
调用只需要一行:
J = deep_flatten(J, {'symbols': 'symbol', 'filters': 'filterType'})
性能说明
两种方案转换后的结构都是标准Python字典嵌套,查找时间复杂度都是O(1),和你原来的实现查找效率完全一致,满足高效查找的需求。
内容的提问来源于stack exchange,提问作者P i
相关产品推荐
相关产品推荐

