Python中列表索引越界问题:如何用range()捕获列表最后一个元素?
问题描述
我想要使用range函数遍历一个数字列表,以生成一个新列表,其中原列表中的每个偶数都要翻倍。但无论如何尝试,我都无法捕获列表的最后一个元素。我的原始代码如下:
my_list = [1, 2, 3, 4] encoded_list = [] odd = 0 even = 1 for position in range(0, len(my_list) - 1): if my_list[position] == my_list[odd]: number = my_list[odd] encoded_list = encoded_list + [number] odd = odd + 2 elif my_list[position] == my_list[even]: number = my_list[even] + 2 encoded_list = encoded_list + [number] even = even + 2 print(encoded_list)
输出:
[1, 4, 3]
目前我尝试将range(0, len(my_list) - 1)替换为range(len(my_list))和range(0, 3),但都会返回错误信息IndexError: list index out of range。请问有没有办法使用range()函数解决这个问题?
问题分析
你的核心问题在于维护odd和even索引变量的逻辑完全错误:
- 用
my_list[position] == my_list[odd]判断当前元素是奇数位元素毫无意义,当列表存在重复元素时逻辑会直接混乱;且每次循环后强制让odd和even加2,很快就会超出列表索引范围,触发IndexError。 - 原代码的
range(0, len(my_list)-1)刻意跳过了最后一个元素,这就是无法捕获最后一个元素的直接原因。
解决方案
完全不需要额外维护odd和even变量,直接用range(len(my_list))遍历每个元素的索引,判断元素本身的奇偶性即可:
my_list = [1, 2, 3, 4] encoded_list = [] for position in range(len(my_list)): num = my_list[position] if num % 2 == 0: # 偶数翻倍 encoded_list.append(num * 2) else: # 奇数直接保留 encoded_list.append(num) print(encoded_list)
输出结果:
[1, 4, 3, 8]
如果想要更简洁的写法,也可以用列表推导式结合range:
my_list = [1, 2, 3, 4] # 直接遍历元素的写法(本质和用range遍历索引等价) encoded_list = [num * 2 if num % 2 == 0 else num for num in my_list] # 或者用range遍历索引的写法: # encoded_list = [my_list[i] * 2 if my_list[i] % 2 == 0 else my_list[i] for i in range(len(my_list))] print(encoded_list)
内容的提问来源于stack exchange,提问作者John Gibbonsp
相关产品推荐
相关产品推荐

