Python如何匹配字典内嵌列表值获取对应键 实现随机选餐厅
餐厅随机筛选函数修正方案
现有代码存在以下逻辑错误,无法实现预期筛选效果:
- 遍历字典时仅获取了属性值,没有同步拿到对应的餐厅名称,匹配后加入列表的是属性值而非餐厅名
- 随机返回的逻辑写在了循环内部,第一次循环就会终止执行,无法遍历完所有餐厅数据
- 候选列表定义在全局作用域,多次调用函数会残留历史匹配结果,导致返回错误
- 使用
list、type作为变量名,会覆盖Python内置的类型和方法,容易引发异常 - 全随机分支没有实现对应逻辑,也没有处理无匹配结果的异常场景
修正后完整代码
import random Restaurants = { "Eureka": ["American", "$$", "Lunch", "Dinner"], "Le_Pain": ["Bakery", "$$", "Breakfast", "Lunch", "Dinner"], "Creme_Bakery": ["Bakery", "$", "Snack"] } def simple_chooser(): print('请选择筛选模式:randomize(完全随机)、type(按菜系类型)、price(按价格)、meal(按用餐时段)') mode = input().strip() # 完全随机模式 if mode == "randomize": return random.choice(list(Restaurants.keys())) # 按菜系类型筛选 elif mode == "type": print("可选类型:American, Bakery, Pie, Ice_Cream, Bagels, Asian, Chocolate, Italian, Pizza, Thai, Mexican, Japanese, Acai, Mediterranean, Boba/Coffee") selected_type = input().strip() candidates = [] for rest_name, attrs in Restaurants.items(): if selected_type in attrs: candidates.append(rest_name) if not candidates: return "未找到匹配该类型的餐厅" return random.choice(candidates) # 函数调用测试 if __name__ == "__main__": selected = simple_chooser() print(f"筛选结果:{selected}")
核心逻辑说明
- 遍历餐厅字典时使用
items()方法,同时拿到餐厅名称和对应的属性列表,匹配筛选条件时将餐厅名加入候选列表 - 候选列表定义在函数内部,每次调用函数都会重新初始化,不会残留历史数据
- 所有遍历、筛选逻辑执行完成后,再从候选列表里随机选结果,不会提前终止循环
- 增加了无匹配结果的兜底判断,避免对空列表执行随机选择时报错
- 输入增加
strip()处理,自动忽略用户输入的首尾空格,降低输入格式导致的匹配失败概率 - 后续要加价格、用餐时段的筛选逻辑,和类型筛选的写法完全一致,只需要新增对应分支,判断用户输入的价格/时段是否在餐厅属性列表里即可
内容的提问来源于stack exchange,提问作者qiannianchong
相关产品推荐
相关产品推荐

