如何通过列表操作生成行号区间列表并合并文本文件对应行?
问题与解决方案
问题描述
我有一个文本文件的行号列表:
linenrs = [8,12,18,21]
希望合并从一个行号到下一个行号之间的所有行内容。自己编写了一段可运行代码,但想通过列表操作实现需求,先得到如下行号区间列表,再据此合并对应行的内容:
newlist = [[8,9,10,11], [12,13,14,15,16,17], [18,19,20], [21,22,23]]
原始代码
newlist, templist = [], [] counter = 0 separator = " " for i in range(1, 24): #23 lines in textfileline temps = texfileline(i) if i in linenrs: if counter == 0: templist.append(temps) counter = 1 elif counter == 1: newlist.append(separator.join(templist)) templist = [] templist.append(temps) counter = 1 elif counter == 1 and i <= linenrs[-1]: templist.append(temps) else: newlist.append(temps)
解决方案
1. 生成行号区间列表
可以通过列表推导式结合range、zip直接生成目标区间列表,逻辑更简洁:
linenrs = [8,12,18,21] # 扩展行号列表,添加文件总行数+1(24),用于处理最后一段区间 extended_linenrs = linenrs + [24] # 配对相邻行号,生成每个区间的行号列表 line_ranges = [list(range(start, end)) for start, end in zip(extended_linenrs[:-1], extended_linenrs[1:])]
运行后line_ranges就是期望的行号区间列表:[[8,9,10,11], [12,13,14,15,16,17], [18,19,20], [21,22,23]]
2. 基于区间列表合并文本内容
拿到区间列表后,直接遍历每个区间提取内容并合并,同时可补充区间外的行:
separator = " " merged_content = [] # 先补充1到第一个目标行号之前的行(1-7行) for i in range(1, linenrs[0]): merged_content.append(texfileline(i)) # 遍历每个区间,合并对应行内容 for rng in line_ranges: merged_line = separator.join([texfileline(num) for num in rng]) merged_content.append(merged_line)
这种写法避免了复杂的计数器判断,完全通过列表操作实现需求,代码可读性更高。
内容的提问来源于stack exchange,提问作者Reman
相关产品推荐
相关产品推荐

