You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python迭代器分组排序列数据:最后一组未返回的问题求解

问题分析与代码修复

你的代码核心问题出在文件读取至末尾时的逻辑顺序:当line为空(文件读完),你先执行了raise StopIteration,这会直接终止迭代,后续的return self.trunk完全没机会执行,导致最后一组数据无法返回。

另外原代码还有两处可以优化的细节:

  • 初始化self.last为[]会让首次判断逻辑绕弯,改成None更清晰
  • 每次__next__里用self.trunk = [self.last]初始化分组,容易引入空列表的冗余判断

下面是修复后的代码:

class sequence(object):
    def __init__(self, filePath):
        self.file = open(filePath, 'r')
        self.current_group = []
        self.next_line = None

    def __iter__(self):
        # 预读第一行,初始化后续迭代的起始数据
        line = self.file.readline()
        if line:
            self.next_line = line.strip('\n').split('\t')
        return self

    def __next__(self):
        # 无后续数据且当前分组为空时,终止迭代并关闭文件
        if self.next_line is None and not self.current_group:
            self.file.close()
            raise StopIteration
        
        # 初始化当前分组为第一个元素
        self.current_group = [self.next_line]
        # 循环读取后续行,直到分组结束或文件末尾
        while True:
            line = self.file.readline()
            if not line:
                # 文件读完,返回当前分组,下次迭代触发终止
                self.next_line = None
                return self.current_group
            line_data = line.strip('\n').split('\t')
            if line_data[1] == self.current_group[0][1]:
                self.current_group.append(line_data)
            else:
                # 遇到不同分组,保存当前行,返回已收集的分组
                self.next_line = line_data
                return self.current_group

# 测试执行
a = sequence('tst.txt')
for i in a:
    print(i)

关键修复说明:

  1. 在__iter__方法里预读第一行,避免__next__中重复处理初始化逻辑
  2. 文件读取到末尾时,先返回当前已收集的完整分组,再在下次迭代时触发终止
  3. 添加文件关闭逻辑,避免资源泄漏
  4. 简化分组判断逻辑,让代码更直观易懂

运行修复后的代码,就能得到包含最后一组D的完整四组结果。

内容的提问来源于stack exchange,提问作者Zewei Song

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:24:19