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

Python实现JSON指定键对应列表值的查找问题求助

问题:查找并删除JSON中指定键下的列表元素

我正在完成一项练习,需要查找JSON文件中的元素并将其删除,目前遇到的问题是无法正确查找指定键及其对应列表中的值。

我的menupizzeria.json文件内容如下:

{"tamañospizza": ["Personal", "Mediana", "Grande", "Extragrande"],"borde": [{"Normal": [0, 1, 2, 3]}, {"Queso": [1, 2]}],"masa": ["delgada", "sazonada"], "salsas": ["roja", "rosada"], "Ingredientes": ["cebolla", "3", "f", "g", "h", "r", "s", "", "a", "a"]}

我尝试写函数搜索指定键(比如"masa"),如果存在就查找对应列表里的值(比如"delgada"),但始终拿不到对应值,只能拿到键。我的代码如下:

import json

def read_menu(path):
    with open(path, "r", encoding='utf-8') as file:
        menu = json.load(file)
    return menu

def get_fields(input_data):
    fields = list(input_data)
    search = input("Please enter a field to search: ")
    result = []
    found = fields.index(search)
    indice = fields[found]
    if indice in fields:
        values = input(f"please enter a value to search: ")
        for field in input_data:
            if input_data[field] == values:
                result.append(field)
        if len(result) <= 0:
            print("NO results where found")
        elif len(resultado) == 1:
            print(f"one result was found: {result[0]} ")
        else:
            print(f"found {len(result)} results: ")
    else:
        print(f"found {len(resultado)} results")
    

menupi = read_menu("menupizzeria.json")
print(type(menupi))
get_fields(menupi)

问题分析

  1. 逻辑错误:遍历所有键时,用input_data[field] == values做比较,但input_data[field]是列表类型,values是字符串,两者永远不可能相等,自然找不到结果。
  2. 拼写错误:代码中多次出现resultado,但变量名是result,会触发NameError。
  3. 冗余操作:用fields.index(search)再取fields[found]完全多余,直接判断search in input_data就能确认键是否存在。

修正后的代码(实现查找+删除功能)

import json

def read_menu(path):
    with open(path, "r", encoding='utf-8') as file:
        menu = json.load(file)
    return menu

def find_and_remove_value(input_data):
    target_key = input("请输入要搜索的键:")
    
    # 检查目标键是否存在
    if target_key not in input_data:
        print(f"键 '{target_key}' 不存在于JSON中")
        return
    
    target_value_list = input_data[target_key]
    # 确保目标键对应的值是列表(兼容JSON里的嵌套结构)
    if not isinstance(target_value_list, list):
        print(f"键 '{target_key}' 对应的值不是列表,无法处理")
        return
    
    target_value = input("请输入要查找并删除的值:")
    
    # 查找并删除所有匹配的值(处理重复值)
    if target_value in target_value_list:
        while target_value in target_value_list:
            target_value_list.remove(target_value)
        print(f"已删除列表中所有 '{target_value}' 实例")
        
        # 将修改后的内容写回JSON文件
        with open("menupizzeria.json", "w", encoding='utf-8') as f:
            json.dump(input_data, f, ensure_ascii=False, indent=4)
        print("修改已保存到文件")
    else:
        print(f"列表中未找到 '{target_value}'")

menupi = read_menu("menupizzeria.json")
find_and_remove_value(menupi)

代码改进说明

  • 直接判断键是否存在,避免index方法导致的键不存在报错
  • 聚焦目标键对应的列表,直接检查值是否在列表内,逻辑更清晰
  • 支持删除列表中的重复值(用while循环)
  • 增加类型检查,避免处理非列表类型的值
  • 自动将修改后的JSON写回文件,完成完整的编辑流程
  • 用中文提示更直观(可自行改回英文)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:18:25