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

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. 按三位标识码升序输出每个作品的统计信息,包含最长行及对应行号、最短行及对应行号、全行平均长度
  2. 按三位标识码升序输出还原后的作品文本,不同作品之间用-----分隔,每行按行号排序拼接

问题解答

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:06:07