Python新手求助:实现按用户输入从数字列表中减去指定值
解决Python列表修改的索引错误与优化方案
问题分析
你代码里的核心问题是把用户输入的目标数字直接当成了列表索引——比如输入15时,list[15]会试图访问列表的第16个元素(Python列表索引从0开始),但原列表只有4个元素,肯定会触发IndexError索引越界错误。
修正与优化方案
1. 基础修复:先找索引再修改
最直接的修复方式是用list.index()拿到目标数字在列表里的索引,再修改对应位置的值:
my_list = [5, 10, 15, 20] print(my_list) try: number = int(input("what number you want from the list?\n> ")) # 拿到目标数字的索引 idx = my_list.index(number) remove = int(input("by how much you want to subtract?\n> ")) # 修改对应位置的值 my_list[idx] -= remove print(f">> {my_list}") except ValueError: print("not a valid number")
注意:如果列表里有重复的数字,
index()只会返回第一个匹配项的索引。
2. 一行代码实现:列表推导式
要是想更简洁(一行搞定修改逻辑),可以用列表推导式直接生成修改后的列表,不用手动处理索引:
my_list = [5, 10, 15, 20] print(my_list) try: number = int(input("what number you want from the list?\n> ")) remove = int(input("by how much you want to subtract?\n> ")) # 一行完成所有匹配元素的修改 my_list = [x - remove if x == number else x for x in my_list] print(f">> {my_list}") except ValueError: print("not a valid number")
这种方式会遍历整个列表,自动把所有等于目标数字的元素都减去指定值(如果列表里有重复数字,所有匹配项都会被修改),比手动找索引更灵活。
3. 原地修改原列表
如果不想生成新列表,要直接修改原列表,可以用enumerate()同时遍历索引和元素:
my_list = [5, 10, 15, 20] print(my_list) try: number = int(input("what number you want from the list?\n> ")) remove = int(input("by how much you want to subtract?\n> ")) # 遍历列表,原地修改匹配的元素 for idx, x in enumerate(my_list): if x == number: my_list[idx] -= remove print(f">> {my_list}") except ValueError: print("not a valid number")
测试结果
运行上述任意一段代码,输入示例中的15和6,都会输出>> [5, 10, 9, 20],完全符合你想要的效果。
内容的提问来源于stack exchange,提问作者muryllo
相关产品推荐
相关产品推荐

