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

如何在Python中剔除JSON文件中缺少指定键的字典?

嵌套JSON筛选与字段提取方案

需求说明

现有大型嵌套JSON结构,需提取其中FLOODING、date、filename三个字段的键值对,但部分子字典缺失filename字段,导致原提取函数无法生成等长数组。需要先剔除缺失必填键的字典,再完成字段提取,也可选择将筛选后的结果保存为新JSON文件后再处理。

解决方案

方案1:先筛选有效字典,再提取字段

先递归遍历JSON结构,收集所有包含FLOODING、date、filename三个必填键的字典,再从这些有效字典中提取对应字段值,确保数组长度一致。

筛选有效字典的函数

def filter_valid_dicts(obj):
    """递归遍历嵌套JSON,筛选出包含所有必填键的字典"""
    valid_dicts = []
    
    def traverse(item):
        if isinstance(item, dict):
            # 检查当前字典是否包含全部必填字段
            required_keys = {'FLOODING', 'date', 'filename'}
            if required_keys.issubset(item.keys()):
                valid_dicts.append(item)
            # 继续遍历子层级
            for value in item.values():
                traverse(value)
        elif isinstance(item, list):
            for elem in item:
                traverse(elem)
    
    traverse(obj)
    return valid_dicts

提取字段并生成等长数组

# 假设原始JSON数据存储在变量data中
valid_data = filter_valid_dicts(data)

# 批量提取各字段
flooding_values = [d['FLOODING'] for d in valid_data]
date_values = [d['date'] for d in valid_data]
filename_values = [d['filename'] for d in valid_data]

方案2:合并筛选与提取为单一函数

直接在递归遍历过程中完成筛选和字段提取,一步得到三个等长数组:

def extract_filtered_fields(obj):
    """递归提取符合条件的字段,返回三个等长数组"""
    flooding = []
    dates = []
    filenames = []
    
    def traverse(item):
        if isinstance(item, dict):
            required_keys = {'FLOODING', 'date', 'filename'}
            if required_keys.issubset(item.keys()):
                flooding.append(item['FLOODING'])
                dates.append(item['date'])
                filenames.append(item['filename'])
            # 遍历子元素
            for val in item.values():
                traverse(val)
        elif isinstance(item, list):
            for elem in item:
                traverse(elem)
    
    traverse(obj)
    return flooding, dates, filenames

# 使用示例
flooding_arr, date_arr, filename_arr = extract_filtered_fields(data)

保存筛选后的JSON到文件

如果需要将筛选后的有效字典保存为新文件,可执行以下代码:

import json

valid_data = filter_valid_dicts(data)
with open('filtered_flood_data.json', 'w', encoding='utf-8') as f:
    json.dump(valid_data, f, indent=2)

内容的提问来源于stack exchange,提问作者mountainscaler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:35:25