Python检查输入是否在列表中时如何实现lower()式不区分大小写匹配
问题根源
lower()是Python字符串对象的专属方法,列表类型没有内置该方法,直接调用itemList.lower()会抛出属性错误,无法完成批量转小写的操作。
修正逻辑
要实现不区分大小写的匹配,只需要在校验时把列表内的每个字符串元素单独转成小写,和转成小写的用户输入做比对即可,不需要修改原列表存储的标准大小写格式。
直接适配原有代码的修正版本
保留原有的数字ID输入判断逻辑,仅修改名称校验部分的代码即可:
itemList = ['Dirt', 'Oak Log'] def takeName(): itemName = '' while itemName == '': itemName = input('What Minecraft item would you like the crafting recipe for?\n') try: # 输入为数字时直接作为物品ID返回 itemName = int(itemName) except ValueError: # 输入为字符串时做大小写不敏感匹配 input_lower = itemName.lower() # 生成原列表对应的全小写临时对照列表 lower_item_list = [item.lower() for item in itemList] if input_lower not in lower_item_list: print('Not a valid Minecraft item name or ID!\n') itemName = '' else: # 取匹配项在原列表中的索引 itemName = lower_item_list.index(input_lower) return itemName
大列表优化方案
如果后续物品列表扩充到上百上千条,可以提前构建小写内容到索引的映射字典,查找效率更高,不需要每次循环都生成临时列表:
itemList = ['Dirt', 'Oak Log'] # 预构建小写映射:key为全小写物品名,value为对应原列表索引 item_index_map = {item.lower(): idx for idx, item in enumerate(itemList)} def takeName(): itemName = '' while itemName == '': itemName = input('What Minecraft item would you like the crafting recipe for?\n') try: itemName = int(itemName) except ValueError: input_lower = itemName.lower() if input_lower not in item_index_map: print('Not a valid Minecraft item name or ID!\n') itemName = '' else: itemName = item_index_map[input_lower] return itemName
注意:如果后续给itemList新增/删除物品,需要同步更新item_index_map映射,否则会出现匹配错误。
内容的提问来源于stack exchange,提问作者Kyran McCown
相关产品推荐
相关产品推荐

