Python实现按规则分组读取stdin行并生成两字符串的最优方案
处理stdin行分组的最优实现方案
嘿,这个需求很明确,我给你分享几个高效且易维护的实现思路,比手动每次解析8行要灵活得多:
方法1:基于行号的周期判断(内存友好,推荐大输入场景)
核心思路是利用行号的数学规律:每8行为一个周期,前4行归组A,后4行归组B。我们可以逐行读取输入,边读边分组,不用一次性加载所有内容到内存,适合处理超大输入。
import sys # 初始化两个分组列表 group_a = [] group_b = [] # 用enumerate从1开始计数行号 for line_num, line in enumerate(sys.stdin, start=1): # 移除末尾换行符(根据需求可调整,比如保留的话就去掉这行) cleaned_line = line.rstrip('\n') # 计算当前行在8行周期内的位置(0-7) cycle_position = (line_num - 1) % 8 if cycle_position < 4: group_a.append(cleaned_line) else: group_b.append(cleaned_line) # 转换为最终需要的字符串(用换行符连接) result_str_a = '\n'.join(group_a) result_str_b = '\n'.join(group_b)
方法2:按8行块批量处理(直观易读,适合小输入场景)
如果输入内容不大,一次性读取所有行后按块切分处理会更直观,也容易处理最后一块不足8行的边界情况:
import sys # 一次性读取所有行并清理换行符 all_lines = [line.rstrip('\n') for line in sys.stdin.readlines()] group_a = [] group_b = [] # 每8行作为一个块循环处理 for i in range(0, len(all_lines), 8): current_block = all_lines[i:i+8] # 前4行加入组A,剩余的加入组B(自动处理不足8行的情况) group_a.extend(current_block[:4]) group_b.extend(current_block[4:]) result_str_a = '\n'.join(group_a) result_str_b = '\n'.join(group_b)
小提示
- 如果你的输入是超大文件/数据流,优先选方法1,因为它不会把所有内容加载到内存,内存占用更低;
- 如果输入内容较小,方法2的代码可读性更高,调试起来也更方便;
- 两种方法都自动处理了输入行数不是8的倍数的情况,比如最后只剩3行,这3行会全部归入组A;如果最后剩5行,前4行入A,最后1行入B。
内容的提问来源于stack exchange,提问作者Superwiz1
相关产品推荐
相关产品推荐

