如何实现列表的大小写不敏感输入匹配?无需双数组的优化方案
问题与解决方案
问题描述
我正在重写自己的旧程序,尝试用列表替代大量变量来更优地管理值。已经创建了存储区块名称的列表,通过if-elif-else判断输入是否匹配列表值。为了实现输入大小写不敏感,我额外创建了一个内容相同的小写列表,但需要维护两个列表很麻烦,有没有更简便的方法?
原代码如下:
import time # 补充原代码遗漏的导入 block = ["Concrete_1","Concrete_2","Concrete_3","Metal_1","Metal_2","Metal_3","Wood_1","Wood_2","Wood_3","Barrier_Block"] block_lower = ["concrete_1","concrete_2","concrete_3","metal_1","metal_2","metal_3","wood_1","wood_2","wood_3","barrier_block"] for x in block: print(x) time.sleep(0.125) choice = 0 # 补充原代码遗漏的变量初始化 while choice == 0: input_str = "Choose a block\n" choice = input(input_str) if choice.lower() == block_lower[0]: print("\n",block[0]) # 修正原代码笔误block_[0] elif choice.lower() == block_lower[1]: print("\n",block[1]) elif choice.lower() == block_lower[2]: print("\n",block[2]) elif choice.lower() == block_lower[6]: print("\n",block[6]) elif choice.lower() == block_lower[7]: print("\n",block[7]) elif choice.lower() == block_lower[8]: print("\n",block[8]) elif choice.lower() == block_lower[3]: print("\n",block[3]) elif choice.lower() == block_lower[4]: print("\n",block[4]) elif choice.lower() == block_lower[5]: print("\n",block[5]) elif choice.lower() == block_lower[9]: print("\n",block[9]) else: print("Idiot") # Error catch to prevent program from crashing due to a mispelled word or someone thinking their smart and trying to break the code choice = 0 # Resets the value to 0 so the loop repeats
注:else分支输出的"Idiot"仅为占位符,后续会修改
优化方案
完全不需要维护两个列表,以下两种方法更简洁易维护:
方法1:匹配时直接转换列表元素为小写
无需额外列表,将用户输入转小写后,直接和原列表元素的小写形式对比,同时用循环替代冗长的if-elif链:
import time block = ["Concrete_1","Concrete_2","Concrete_3","Metal_1","Metal_2","Metal_3","Wood_1","Wood_2","Wood_3","Barrier_Block"] for x in block: print(x) time.sleep(0.125) choice = 0 while choice == 0: input_str = "Choose a block\n" user_input = input(input_str).lower() matched = False # 遍历列表对比小写形式 for item in block: if item.lower() == user_input: print("\n", item) matched = True break if not matched: print("输入无效,请重新选择") choice = 0 else: choice = 1 # 匹配成功退出循环
方法2:构建小写映射字典
如果区块数量较多,用字典做映射可以提升匹配效率,只需提前构建一次“小写名称-原名称”的映射:
import time block = ["Concrete_1","Concrete_2","Concrete_3","Metal_1","Metal_2","Metal_3","Wood_1","Wood_2","Wood_3","Barrier_Block"] # 生成小写到原名称的映射字典 block_map = {item.lower(): item for item in block} for x in block: print(x) time.sleep(0.125) choice = 0 while choice == 0: input_str = "Choose a block\n" user_input = input(input_str).lower() # 直接通过字典查找匹配 if user_input in block_map: print("\n", block_map[user_input]) choice = 1 else: print("输入无效,请重新选择") choice = 0
内容的提问来源于stack exchange,提问作者Jaxer5636
相关产品推荐
相关产品推荐

