如何在Python字典内检索?基于关键词查找菜谱字典的实现问询
嘿,这就来帮你解决这两个问题!先从Python字典的基础检索讲起,再一步步实现你的菜谱关键词搜索需求。
一、Python字典的基础检索方法
Python字典是键值对结构,检索数据主要有这几种常用方式:
- 直接通过键访问:如果你确定键存在,直接用
字典名[键]就能拿到对应的值,比如my_dict['name']。但要注意,如果键不存在会抛出KeyError,所以更稳妥的方式是用get()方法,还能设置默认值:my_dict.get('name', '未找到该键'),这样键不存在时就返回你设置的默认值,不会报错。 - 检查键是否存在:用
in关键字先判断,比如if 'price' in my_dict:,确认存在后再检索,能避免不必要的错误。 - 批量遍历检索:如果要遍历所有键、值或者键值对,可以用:
my_dict.keys():获取所有键的列表my_dict.values():获取所有值的列表my_dict.items():获取所有键值对的元组列表,比如for key, value in my_dict.items():就能逐个处理每个键值对。
二、菜谱字典的关键词搜索实现
先假设你的菜谱字典结构大概是这样的(可以根据实际情况调整):
recipes = { "番茄炒蛋": { "keywords": ["番茄", "鸡蛋", "家常菜", "快手"], "time": 15, # 单位:分钟 "ingredients": ["番茄", "鸡蛋", "盐", "糖"] }, "红烧肉": { "keywords": ["猪肉", "红烧", "硬菜", "下饭"], "time": 40, "ingredients": ["五花肉", "生抽", "老抽", "冰糖"] }, "凉拌黄瓜": { "keywords": ["黄瓜", "凉拌", "素菜", "开胃"], "time": 5, "ingredients": ["黄瓜", "蒜末", "醋", "生抽"] } }
接下来我们实现根据关键词搜索,返回菜谱名称和时间的功能,分几种常见场景:
1. 单个关键词搜索
比如输入“快手”,找到所有包含这个关键词的菜谱:
def search_single_keyword(recipe_dict, keyword): matched_recipes = [] for recipe_name, details in recipe_dict.items(): # 检查当前菜谱的关键词列表是否包含搜索词 if keyword in details["keywords"]: matched_recipes.append({ "菜谱名称": recipe_name, "所需时间": f"{details['time']}分钟" }) return matched_recipes # 调用示例 print(search_single_keyword(recipes, "快手")) # 输出: [{'菜谱名称': '番茄炒蛋', '所需时间': '15分钟'}]
2. 多个关键词任意匹配
输入多个关键词,只要菜谱包含其中任意一个就返回:
def search_any_keyword(recipe_dict, keywords): matched_recipes = [] # 把搜索关键词转成集合,方便快速判断交集 search_set = set(keywords) for recipe_name, details in recipe_dict.items(): recipe_keywords = set(details["keywords"]) # 求两个集合的交集,如果非空说明有匹配 if search_set & recipe_keywords: matched_recipes.append({ "菜谱名称": recipe_name, "所需时间": f"{details['time']}分钟" }) return matched_recipes # 调用示例:搜索包含"家常菜"或"素菜"的菜谱 print(search_any_keyword(recipes, ["家常菜", "素菜"])) # 输出: [{'菜谱名称': '番茄炒蛋', '所需时间': '15分钟'}, {'菜谱名称': '凉拌黄瓜', '所需时间': '5分钟'}]
3. 多个关键词全部匹配
输入多个关键词,必须菜谱包含所有关键词才返回:
def search_all_keywords(recipe_dict, keywords): matched_recipes = [] search_set = set(keywords) for recipe_name, details in recipe_dict.items(): recipe_keywords = set(details["keywords"]) # 判断搜索关键词是否是菜谱关键词的子集 if search_set.issubset(recipe_keywords): matched_recipes.append({ "菜谱名称": recipe_name, "所需时间": f"{details['time']}分钟" }) return matched_recipes # 先加一个包含多个重叠关键词的菜谱 recipes["番茄鸡蛋面"] = { "keywords": ["番茄", "鸡蛋", "面食", "快手"], "time": 10, "ingredients": ["番茄", "鸡蛋", "面条", "盐"] } # 调用示例:搜索同时包含"番茄"和"鸡蛋"的菜谱 print(search_all_keywords(recipes, ["番茄", "鸡蛋"])) # 输出: [{'菜谱名称': '番茄炒蛋', '所需时间': '15分钟'}, {'菜谱名称': '番茄鸡蛋面', '所需时间': '10分钟'}]
额外优化建议
- 不区分大小写:如果要支持大小写不敏感搜索,可以把所有关键词转成小写(或大写)再匹配,比如:
if keyword.lower() in [k.lower() for k in details["keywords"]] - 模糊匹配:如果想支持部分字符匹配(比如输入“茄”也能找到番茄相关菜谱),可以改成字符串包含判断:
if any(keyword in k for k in details["keywords"])
内容的提问来源于stack exchange,提问作者NIkita Maksimov
相关产品推荐
相关产品推荐

