You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现列表的大小写不敏感输入匹配?无需双数组的优化方案

问题与解决方案

问题描述

我正在重写自己的旧程序,尝试用列表替代大量变量来更优地管理值。已经创建了存储区块名称的列表,通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:21:16