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

Python实现Floyd三角形格式打印文本文件内容求助

问题与修正:Python循环与Floyd三角形格式打印问题

我是Python新手,项目里碰到循环问题。需求是从txt文件读取内容,先按每行开头的数字排序,再以Floyd三角形格式打印(省略数字部分)。现在代码输出不对,求修正。

原txt文件内容

4  jeeps
5  trees
2  dogs
1  I
6  coding
3  love

当前代码

def mysort(line):
    return line.split()[0]

with open("message_file.txt", "r") as f:
    text = f.readlines()
n = int(len(text))
count = n
for line in sorted(text, key=mysort):
    for i in range(n):
        for j in range(i):
            print(count, end='')
        print (line[3:].strip())

当前错误输出

I
    6I
    66I
    666I
    6666I
    66666I
    dogs
    6dogs
    66dogs
    666dogs
    6666dogs
    66666dogs
    etc...

期望输出

I
    dogs love
    jeeps trees coding

问题分析与修正

原代码问题点

  • 多层循环逻辑错误:遍历排序后的每行时,重复执行了n次打印,导致同一内容被输出多次,还错误打印了count值
  • 未按Floyd三角形规则分组:没有实现“第1行1个元素、第2行2个元素、第3行3个元素”的分组逻辑
  • 排序与文本截取存在隐患:用字符串排序可能导致数字顺序错误,固定截取line[3:]无法适配不同位数的数字

修正后的代码

def mysort(line):
    # 转为整数排序,避免字符串排序的顺序错误
    return int(line.split()[0])

with open("message_file.txt", "r") as f:
    # 读取所有行并按开头数字排序
    sorted_lines = sorted(f.readlines(), key=mysort)
    # 提取每行的文本部分(去掉开头数字和空格)
    content_list = [line.split(maxsplit=1)[1].strip() for line in sorted_lines]

# 计算Floyd三角形的行数:找到最大k,满足k*(k+1)/2 ≤ 总元素数
total = len(content_list)
row_count = 0
while (row_count + 1) * (row_count + 2) // 2 <= total:
    row_count += 1

# 按Floyd格式打印内容
current_index = 0
for i in range(1, row_count + 1):
    # 取当前行需要的i个元素,用空格连接
    row_content = content_list[current_index:current_index + i]
    print("    " + " ".join(row_content))
    current_index += i

修正说明

  1. 排序逻辑优化:将排序键转为整数,避免字符串排序导致的数字顺序错误(比如"10"不会排在"2"前面)
  2. 精准提取文本:用split(maxsplit=1)分割数字和文本,比固定截取更灵活,适配不同位数的数字
  3. 正确分组打印:先计算Floyd三角形的行数(6个元素对应3行:1+2+3=6),再按每行对应元素数量从排序后的列表中取值,拼接后打印
  4. 移除无效循环:删除了原代码中重复打印的嵌套循环,避免内容重复输出和错误的count值打印

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:57:23