Python打乱文本文件还原、统计输出及代码问题咨询
Python乱序文本文件解码实现指南
需求说明
输入的乱序文本每行由文本内容|行号|三位作品标识码三部分组成,示例如下:
it ran away when it saw mine coming!"|164|ALC cried to the man who trundled the barrow; "bring up alongside and help|27|TRI "Of course he's stuffed," replied Dorothy, who was still angry.|46|WOO
需要完成两个输出任务:
- 按三位标识码升序输出每个作品的统计信息,包含最长行及对应行号、最短行及对应行号、全行平均长度
- 按三位标识码升序输出还原后的作品文本,不同作品之间用
-----分隔,每行按行号排序拼接
问题解答
1. 适用数据结构与实现建议
推荐用以下结构和方法实现:
- 核心存储用字典,key为三位作品标识码,value为列表,列表每个元素存储
(行号(整数类型), 文本内容)元组,方便后续排序和统计 - 行拆分用
str.split('|')方法,拆分后记得对每个字段做strip()处理去除首尾空格、换行符 - 排序用内置
sorted()方法,按元组第一个元素(行号)排序即可得到正确的行顺序
参考实现代码片段:
# 初始化存储字典 work_data = {} # 读取输入文件 with open('input.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue content, line_num_str, code = line.split('|') line_num = int(line_num_str) # 存入字典 if code not in work_data: work_data[code] = [] work_data[code].append( (line_num, content) ) # 每个作品内部按行号排序 for code in work_data: work_data[code].sort(key=lambda x: x[0])
2. 统计结果异常的常见原因
你遇到的所有作品最长/最短行相同、平均长度为0的问题,基本是以下几个原因导致的:
- 字段拆分错误:拆分后取错了字段,比如把行号/标识码当成了文本内容统计长度,或者行号没有转成整数类型
- 统计变量初始化错误:比如最长行初始长度设得远大于所有实际行长度,最短行初始长度设为0,导致遍历所有行时判断条件都不触发,一直保留初始的默认值
- 累加逻辑遗漏:统计总长度、总行数的变量没有做累加操作,导致计算平均时分子为0,最终平均长度为0
- 空数据问题:读取文件时编码错误或者过滤逻辑有误,导致没有任何行被正确存入字典,所有统计都用了初始默认值
3. 括号内显示行号的修改方法
你当前输出括号内是字符数,是因为统计时存储的是字符数并输出了该值,修改方法很简单:
统计最长、最短行时,除了记录文本内容、行长度,额外存储对应的行号,输出时把行号放到括号内即可。参考统计逻辑:
for code in sorted(work_data.keys()): lines = work_data[code] # 初始化统计变量 total_len = 0 # 结构:(行号, 内容, 长度) longest = (0, "", 0) shortest = (0, "", 999999) for line_num, content in lines: content_len = len(content) total_len += content_len # 更新最长行 if content_len > longest[2]: longest = (line_num, content, content_len) # 更新最短行 if content_len < shortest[2]: shortest = (line_num, content, content_len) avg_len = round(total_len / len(lines)) # 输出时直接取longest[0]、shortest[0]就是行号 print(f"{code}\n") print(f"Longest Line ({longest[0]}): {longest[1]} Shortest Line ({shortest[0]}): {shortest[1]} Average Length: {avg_len}\n")
4. 按三位标识码升序输出的修改方法
字典默认遍历顺序是插入顺序,只要遍历前先对字典的key做排序即可:
# 不管是输出统计结果还是还原文本,都先对code排序再遍历 for code in sorted(work_data.keys()): # 执行对应输出逻辑 pass
输出还原文本时,在两个作品的内容之间插入-----即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

