You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:39:02