Python循环迭代插入list元素时旧元素残留、列表长度异常问题
问题根源
你在迭代过程中修改了原始列表mass_distr的长度,这是导致异常的核心原因:
- 循环初始时
mass_distr长度为14,range(len(mass_distr))第一次生成的是0~13的序列(共14次迭代) - 每次你在
mass_distr_i里插入smallest后,mass_distr_i的长度会比原mass_distr多1 - 当满足
abs_dist_CG < min_CG的条件时,你执行了mass_distr = mass_distr_i,直接把原始列表替换成了插入后更长的列表 - 后续迭代中你复制的
mass_distr已经是被修改过的长列表,插入后长度自然会进一步累加,最终出现15、16、17、18的异常长度。
修复方案
你需要提前缓存原始的mass_distr作为固定的插入基准,不要在迭代过程中修改这个基准值:
# 提前备份原始质点分布列表,全程作为插入基准 original_mass_distr = mass_distr[:] # 循环次数固定为原始列表长度,不会动态变化 for i in range(len(original_mass_distr)): # 每次都从原始固定列表复制,而不是从可能被修改的mass_distr复制 mass_distr_i = original_mass_distr[:] mass_distr_i.insert(i, smallest) # 后续计算逻辑不变,仅更新最优结果的存储变量,不要修改original_mass_distr res = tezisce(mass_distr_i) CG = res[0] opt_pos_i = res[1] abs_dist_CG = np.sqrt(CG[0]**2+CG[1]**2) if abs_dist_CG < min_CG: min_CG = abs_dist_CG CG_xy = CG opt_pos = opt_pos_i # 存储最优分布即可,不会影响后续迭代的基准 optimal_mass_distr = mass_distr_i
修改后每次迭代的基准都是固定长度的原始列表,插入后的mass_distr_i长度会始终保持为15,符合你的预期。
内容的提问来源于stack exchange,提问作者Patrik Hlebec Štor
相关产品推荐
相关产品推荐

