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)
问题分析
- 逻辑错误:遍历所有键时,用
input_data[field] == values做比较,但input_data[field]是列表类型,values是字符串,两者永远不可能相等,自然找不到结果。 - 拼写错误:代码中多次出现
resultado,但变量名是result,会触发NameError。 - 冗余操作:用
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
相关产品推荐
相关产品推荐

