Python开发问题:如何校验用户输入的所有配料均在菜单列表内?
问题解决:确保用户输入的所有食材均在菜单内才执行后续逻辑
原代码的核心问题
- 分割逻辑无效:
split(', ' or ' , ')实际只会按,分割,无法处理用户输入中逗号后带空格(比如Mushroom , Bacon)的情况,导致分割后的元素带空格,匹配失败。 - 判断条件错误:
x_set & menu_set只要用户输入和菜单有交集就执行后续逻辑,完全忽略了输入中存在菜单外元素的情况。 - 缺失错误处理:没有检测并提示用户输入的非法元素,也没有退出程序的逻辑。
修正后的代码实现
import time # 定义菜单食材列表 menu = ["Mushroom", "Bacon", "Sausage", "Pepperoni", "Chicken"] menu_set = set(menu) # 获取并处理用户输入:先按逗号分割,再去除每个元素的前后空格并统一为标题格式 user_input = input("Your desired ingredients: ") user_ask = [item.strip().title() for item in user_input.split(',')] # 检查是否有非法食材 invalid_items = [item for item in user_ask if item not in menu_set] if invalid_items: print(f"错误:以下食材不在菜单内:{', '.join(invalid_items)}") exit() # 所有食材合法,执行后续逻辑 print("\nYou have chosen: ") for item in user_ask: print(item) # 处理蘑菇添加逻辑(示例) if "Mushroom" in user_ask: print("Adding Mushroom...") for waiting_time in range(3, 0, -1): time.sleep(1) print(waiting_time) time.sleep(0.7) print("Mushroom added!") # 可继续添加其他食材的处理逻辑
关键改进点
- 输入处理优化:用列表推导式先分割再
strip()去除空格,再统一为title()格式,确保输入格式和菜单一致,同时兼容不同的逗号分隔写法(比如a,b、a , b、a, b)。 - 非法元素检测:通过列表推导式筛选出不在菜单中的元素,存在则直接提示并退出程序。
- 集合高效匹配:将菜单转为集合
menu_set,利用集合的O(1)查找效率提升判断速度。 - 逻辑顺序调整:先完成所有合法性检查,再执行后续的食材添加逻辑,符合需求要求。
内容的提问来源于stack exchange,提问作者Toriqul_Islam
相关产品推荐
相关产品推荐

