Python if分支运行正常,elif分支触发时抛出ValueError错误
报错核心原因
触发异常的根源是判断逻辑的设计缺陷:执行首个if分支判断时,无论输入内容是否存在于bb列表,都会强制调用bb.index(partyname)方法查找目标元素。当输入为e这类仅存在于dd列表的内容时,bb列表无匹配元素,直接抛出ValueError,程序根本无法进入后续elif分支的判断流程。
另外原代码存在两处冗余逻辑:
- 判断分支里写的
partyname == bb[bb.index(partyname)]完全无意义:bb.index(partyname)能正常运行的前提,就是partyname已经是bb列表的元素,二者本身必然相等,这个对比没有任何判断价值 - 删除流程里的
cc.pop(cc.index(cc[bb.index(partyname)]))做了三次无意义的嵌套索引查找,本质需求是删除与bb中匹配元素同位置的cc元素,完全可以通过单次索引实现
代码修复方法
- 调整判断逻辑:先判断输入是否属于对应列表,确认存在后再调用
index方法取位置,避免未命中时直接触发异常 - 简化删除流程:取到匹配元素的索引后,直接同步删除两个关联列表的同位置元素,去掉冗余的嵌套查找
修复后的可运行代码:
bb = ["a","c","d"] dd = ["e","f","g"] cc = [1,2,3] ee = [4,5,6] partyname = input() partyname = partyname.lower() if partyname in bb: match_idx = bb.index(partyname) bb.pop(match_idx) cc.pop(match_idx) elif partyname in dd: match_idx = dd.index(partyname) dd.pop(match_idx) ee.pop(match_idx) print(bb) print(cc) print(dd) print(ee)
长期优化提示:多组平行列表存储配对映射的方式,很容易因为手动操作位置出现错位问题,当配对项数量变多、分支逻辑变复杂时,更适合用字典结构直接存储键值对应关系,从根源减少位置匹配出错的概率。
内容的提问来源于stack exchange,提问作者Ahmed Tawakol
相关产品推荐
相关产品推荐

