Python列表扩容至目标长度时索引越界问题求解(附代码)
问题解决:列表扩容至指定长度且每个元素重复两次
错误原因分析
你的代码在原列表长度小于45时触发IndexError,核心问题在于循环逻辑依赖diff*2的步长范围:当插入次数超过原列表长度后,lst[i]会访问到不存在的索引。比如原列表长度为44时,需要插入46次,但插入44次后列表长度变为88,此时循环的下一个i值是88,而列表最大索引仅为87,直接触发越界错误。
解决方案
我们可以换一种更稳健的思路:先构建每个元素连续重复两次的基础序列,再通过重复该序列并截断的方式,快速生成长度恰好为90的目标列表。这种方法逻辑清晰,适用于任意原列表长度,不会出现索引问题。
修正后的代码
target = 90 lst = list(range(44)) # 可替换为任意长度的原列表 # 生成每个元素连续重复两次的基础序列 doubled_elements = [] for num in lst: doubled_elements.extend([num, num]) # 计算基础序列需要重复的次数,以及最后需要补充的元素数量 repeat_times = target // len(doubled_elements) remaining = target % len(doubled_elements) # 拼接出最终列表:重复完整序列 + 取基础序列的前remaining个元素 result = doubled_elements * repeat_times + doubled_elements[:remaining] print(result) print(len(result)) # 验证长度为90
代码说明
- 构建基础序列:遍历原列表,将每个元素连续添加两次,确保每个元素都以"重复两次"的形式存在。
- 生成目标列表:通过整数除法计算基础序列需要重复的次数,取余得到最后需要补充的元素数量,最终拼接出长度恰好为90的列表。
更简洁的写法(列表推导式)
用列表推导式可以简化基础序列的构建:
target = 90 lst = list(range(44)) doubled_elements = [num for num in lst for _ in range(2)] repeat_times = target // len(doubled_elements) remaining = target % len(doubled_elements) result = doubled_elements * repeat_times + doubled_elements[:remaining] print(result) print(len(result))
保留原插入逻辑的修复(可选)
如果想保留原有的插入思路,需要调整循环范围,只针对原列表元素插入,再处理剩余扩容需求:
target = 90 lst = list(range(44)) original_len = len(lst) # 先给原列表的每个元素插入一次自身 for i in range(original_len): # 插入位置为原索引的2倍(每次插入会让后续元素后移一位) lst.insert(2 * i, lst[2 * i]) # 若长度仍不足90,从基础序列取元素补充 doubled_elements = [num for num in lst[:original_len] for _ in range(2)] while len(lst) < target: lst.extend(doubled_elements[:target - len(lst)]) print(len(lst)) # 验证长度为90
内容的提问来源于stack exchange,提问作者sheetal dsouza
相关产品推荐
相关产品推荐

