Python嵌套循环异常:外层x循环未迭代,求解决方案
问题原因
核心问题在于zip()返回的是一次性迭代器:第一次内层循环遍历完y_inds后,这个迭代器就被耗尽了,后续外层循环进入内层时,y_inds没有元素可迭代,因此只会输出第一个x值对应的所有y组合。
解决方案
以下三种方式均可修复该问题:
方式1:将zip对象转为列表
把x_inds和y_inds转换为列表,保留所有元素,确保每次内层循环都能重新遍历完整的y索引组合:
import numpy as np x_split = np.linspace(0, 100, 4 + 1, dtype=int) x_start = x_split[:-1] - 5 x_start[0] = 0 x_end = x_split[1:] + 5 x_end[-1] = 100 y_split = np.linspace(0, 100, 4 + 1, dtype=int) y_start = y_split[:-1] - 5 y_start[0] = 0 y_end = y_split[1:] + 5 y_end[-1] = 100 # 转为列表,保存所有索引组合 x_inds = list(zip(x_start, x_end)) y_inds = list(zip(y_start, y_end)) i = 0 for start_x, end_x in x_inds: for start_y, end_y in y_inds: i += 1 print(f"i = {i}") print(f"x = {start_x} {end_x}") print(f"y = {start_y} {end_y}") print("")
方式2:每次外层循环重新生成y_inds
将y_inds的生成逻辑放到外层循环内部,确保每次外层循环都能获取新的y迭代器:
import numpy as np x_split = np.linspace(0, 100, 4 + 1, dtype=int) x_start = x_split[:-1] - 5 x_start[0] = 0 x_end = x_split[1:] + 5 x_end[-1] = 100 y_split = np.linspace(0, 100, 4 + 1, dtype=int) y_start = y_split[:-1] - 5 y_start[0] = 0 y_end = y_split[1:] + 5 y_end[-1] = 100 x_inds = zip(x_start, x_end) i = 0 for start_x, end_x in x_inds: # 每次外层循环重新生成y索引迭代器 y_inds = zip(y_start, y_end) for start_y, end_y in y_inds: i += 1 print(f"i = {i}") print(f"x = {start_x} {end_x}") print(f"y = {start_y} {end_y}") print("")
方式3:用itertools.product生成笛卡尔积
直接生成x和y索引的所有组合,简化嵌套循环逻辑:
import numpy as np from itertools import product x_split = np.linspace(0, 100, 4 + 1, dtype=int) x_start = x_split[:-1] - 5 x_start[0] = 0 x_end = x_split[1:] + 5 x_end[-1] = 100 y_split = np.linspace(0, 100, 4 + 1, dtype=int) y_start = y_split[:-1] - 5 y_start[0] = 0 y_end = y_split[1:] + 5 y_end[-1] = 100 x_inds = zip(x_start, x_end) y_inds = zip(y_start, y_end) i = 0 # 直接生成所有(x,y)索引组合 for (start_x, end_x), (start_y, end_y) in product(x_inds, y_inds): i += 1 print(f"i = {i}") print(f"x = {start_x} {end_x}") print(f"y = {start_y} {end_y}") print("")
验证结果
修改后运行代码,即可得到你期望的输出:
i = 1 x = 0 30 y = 0 30 i = 2 x = 0 30 y = 20 55 i = 3 x = 0 30 y = 45 80 i = 4 x = 0 30 y = 70 100 i = 5 x = 20 55 y = 0 30 i = 6 x = 20 55 y = 20 55 ...
内容的提问来源于stack exchange,提问作者Hugh Warden
相关产品推荐
相关产品推荐

