Python生成器批量输出异常:遗漏数据与末尾批次问题排查
批量生成器遗漏数据的修复方案
你的批量生成器存在两个核心问题,导致输出异常并遗漏数据:
- 元素处理顺序错误:当前逻辑会跳过部分元素的批次添加操作,导致元素遗漏
- 未处理剩余元素:循环结束后,列表中剩余的不足一个批次的元素未被输出
错误原因分析
以batch_size=3为例,处理第4个元素(ans=4)时,此时res已经是[1,2,3](长度等于batch_size),代码会直接yield该列表并重置res,但当前的ans=4没有被添加到新批次中,直接进入下一次循环处理下一个元素,导致ans=4被遗漏。同时,循环结束后剩余的[6,7]也没有被yield出来。
修复后的代码
import itertools def compute_add_generator_batch(batch_size): data = range(5) cases = list(itertools.permutations(data, 2)) print(f"{cases=}") res = [] for x, y in cases: ans = x + y # 先判断批次是否已满,满则输出并重置 if len(res) == batch_size: yield res res = [] # 将当前元素加入批次 res.append(ans) # 循环结束后,输出剩余的不足一个批次的元素 if res: yield res batch_size=3 for res in compute_add_generator_batch(batch_size): print(f"{res=}")
修复说明
- 调整处理顺序:先检查批次是否已满,满则输出并重置,再添加当前元素,确保每个元素都被正确加入批次
- 补充剩余元素处理:循环结束后判断
res是否为空,若不为空则输出剩余元素,避免遗漏最后一批数据
预期输出
cases=[(0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3)] res=[1, 2, 3] res=[4, 1, 3] res=[4, 5, 2] res=[3, 5, 6] res=[3, 4, 5] res=[7, 4, 5] res=[6, 7]
内容的提问来源于stack exchange,提问作者winter
相关产品推荐
相关产品推荐

