Python中基于嵌套children键的path值过滤字典列表的实现方法
Python字典列表筛选(保留含public schema的children条目)
核心逻辑说明
- 遍历每个字典元素,先筛选其
children数组中path包含public的子条目 - 仅保留筛选后
children不为空的父字典,同时替换父字典的children为筛选后的结果 - 处理过程中对原字典做浅拷贝,避免修改原始数据
可复用函数实现
1. 处理完整字典列表的函数
def filter_public_sources(source_list: list[dict]) -> list[dict]: public_list = [] for item in source_list: # 筛选children中path含public的条目 public_children = [ child for child in item.get("children", []) if "public" in child.get("path", []) ] if public_children: # 拷贝原字典,避免修改原始数据 filtered_item = item.copy() filtered_item["children"] = public_children public_list.append(filtered_item) return public_list # 调用示例:不要用list作为变量名,会覆盖Python内置关键字 # public_list = filter_public_sources(你的原始列表变量)
2. 适配Pandas单列应用的函数
如果需要对Pandas中存储单个字典的列做处理,可使用单个元素处理函数配合apply使用:
import pandas as pd def filter_single_source(item: dict) -> dict | None: public_children = [ child for child in item.get("children", []) if "public" in child.get("path", []) ] if public_children: filtered_item = item.copy() filtered_item["children"] = public_children return filtered_item return None # Pandas调用示例,假设存储字典的列名为source_col # df["filtered_source"] = df["source_col"].apply(filter_single_source) # 去除无public条目的行:df = df.dropna(subset=["filtered_source"])
优化提示
如果你的业务场景中public固定出现在path数组的第二位,可以将判断条件替换为len(child.get("path", [])) >=2 and child.get("path")[1] == "public",执行效率更高。
内容的提问来源于stack exchange,提问作者NAB0815
相关产品推荐
相关产品推荐

