Python while循环仅运行1次无法迭代 列表相邻0之间元素批量替换问题
问题原因
- 核心错误是你在
for循环遍历zip(y, y_1)的过程中直接删除了y和y_1的元素,但for循环的迭代器是循环启动时就根据当时的列表长度生成的,删除元素后迭代逻辑直接错乱,导致处理完第一段后就无法继续执行。 - 额外的逻辑隐患:当前
i>j的边界判断逻辑只适配严格递增的分段,泛用性差,还可能出现索引越界问题。
优化实现方案
你的需求本质是将列表按0切分成若干段,每段内容替换为该段最后一个元素的值,不需要额外生成y_1,可以直接通过定位0的位置实现:
y = [0,1,2,3,4,5,6,7,8,0,1,0,1,2,3,4,5,6,7] x = [] # 收集所有0的索引,末尾补列表总长度处理最后一段 zero_indexes = [idx for idx, val in enumerate(y) if val == 0] + [len(y)] for idx in range(len(zero_indexes)-1): seg_start = zero_indexes[idx] seg_end = zero_indexes[idx+1] # 取当前段最后一个元素作为替换值 replace_val = y[seg_end - 1] # 生成对应长度的重复值加入结果 x.extend([replace_val]*(seg_end - seg_start)) print(x)
运行输出和你的预期完全一致:[8, 8, 8, 8, 8, 8, 8, 8, 8, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7]
原有代码修复方案
如果你想保留原有的逻辑框架,只需要在每次删除列表元素后加break跳出当前for循环,让外层while重新生成新的迭代器即可正常运行:
y = [0,1,2,3,4,5,6,7,8,0,1,0,1,2,3,4,5,6,7] y_1 = [1,2,3,4,5,6,7,8,0,1,0,1,2,3,4,5,6,7,0] x = [] while len(y): for i, j in zip(y, y_1): if i > j: z = i for k in range(z+1): x.append(y[i]) del y[0:z+1] del y_1[0:z+1] break elif i == j: z = 0 x.append(z) del y[z] del y_1[z] break
内容的提问来源于stack exchange,提问作者slim
相关产品推荐
相关产品推荐

