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

