如何在Python中展平嵌套对象列表?尝试使用flatten_json的flatten方法
如何展平嵌套层级的对象列表
问题分析
你需要提取嵌套结构中每个层级的独立对象,保留person、city、facebooklink、address四个核心字段,同时移除每个对象中嵌套的子数组字段,最终将所有层级的对象合并为一个扁平列表。
解决方案:递归遍历收集
flatten_json库的flatten方法主要用于将单个嵌套对象的键路径展开为扁平键值对,并不适合直接实现你的需求。更高效的方式是编写一个递归函数,遍历每个层级的对象并收集目标字段:
代码实现
def flatten_nested_structure(input_data): result = [] for item in input_data: # 提取当前层级的核心字段 flat_item = { "person": item["person"], "city": item["city"], "facebooklink": item["facebooklink"], "address": item["address"] } result.append(flat_item) # 检查并处理嵌套的子列表(键与当前city值一致) nested_key = item["city"] if nested_key in item and isinstance(item[nested_key], list): # 递归处理子列表,合并结果 result.extend(flatten_nested_structure(item[nested_key])) return result # 测试输入数据 input_list = [ { "person": "abc", "city": "united states", "facebooklink": "link", "address": "united states", "united states": [ { "person": "cdf", "city": "ohio", "facebooklink": "link", "address": "united states/ohio", "ohio": [ { "person": "efg", "city": "clevland", "facebooklink": "link", "address": "united states/ohio/clevland", "clevland": [ { "person": "jkl", "city": "Street A", "facebooklink": "link", "address": "united states/ohio/clevland/Street A", "Street A": [ { "person": "jkl", "city": "House 1", "facebooklink": "link", "address": "united states/ohio/clevland/Street A/House 1" } ] } ] }, { "person": "ghi", "city": "columbus", "facebooklink": "link", "address": "united states/ohio/columbus" } ] }, { "person": "abc", "city": "washington", "facebooklink": "link", "address": "united states/washington" } ] } ] # 执行展平并输出结果 import json flattened_result = flatten_nested_structure(input_list) print(json.dumps(flattened_result, indent=2))
代码说明
- 函数接收对象列表作为输入,初始化空列表存储最终结果。
- 遍历每个对象:
- 提取四个核心字段组成新对象,添加到结果列表中。
- 检查当前对象是否存在以
city值为键的子列表,若存在则递归处理该子列表,将子列表的展平结果合并到总列表。
- 最终返回的结果完全匹配你需要的扁平对象列表结构。
关于flatten_json的说明
flatten_json的flatten()方法会将嵌套结构的键路径展开为类似united states_0_person的扁平键,得到的是一个单一的扁平字典,无法直接生成你需要的多个独立对象的列表,因此不适合这个场景。
内容的提问来源于stack exchange,提问作者Tanu
相关产品推荐
相关产品推荐

