Python提取金字塔结构每行最后单词失败问题排查
问题定位与修复
你的代码核心问题出在金字塔构建逻辑上,现在的写法每一层只塞了单个单词,根本没把整层元素都放进去,自然取到的不是每层最后一个单词。
错误原因拆解
看这段构建金字塔的代码:
for level in range(1, max_number + 1): row = [line.split()[1] for line in lines if int(line.split()[0]) == current_number] pyramid.append(row) current_number += level
- 循环里的
level从1到max_number(这里是6),但每一轮只找current_number对应的单词:第一轮current_number=1,row里只有chick;第二轮current_number变成1+1=2,row里只有paragraph;第三轮current_number变成2+2=4,row里只有planet。 - 这样金字塔的每一行都是单个元素,
row[-1]只能取到这个唯一元素,结果自然是chick paragraph planet。
修正后的代码
我们需要重新计算每一层的数字区间,把该区间内所有单词都放进对应row,再取最后一个:
def unscramble_lines_from_file(file_path): try: with open(file_path, 'r') as file: lines = [line.strip() for line in file] # 提前拆成(数字, 单词)元组,避免重复split line_tuples = [(int(line.split()[0]), line.split()[1]) for line in lines] sorted_lines = sorted(line_tuples, key=lambda x: x[0]) return sorted_lines except FileNotFoundError: return "File not found." except ValueError: return "Invalid input. Please ensure each line starts with a valid number." def create_pyramid_from_unscrambled_lines(sorted_tuples): try: if isinstance(sorted_tuples, str): return sorted_tuples numbers = [num for num, word in sorted_tuples] word_map = {num: word for num, word in sorted_tuples} pyramid = [] current_start = 1 level = 1 while current_start <= max(numbers): # 计算当前层的结束数字:起始数 + 层数 -1 current_end = current_start + level - 1 # 收集当前层所有数字对应的单词 row = [word_map[num] for num in range(current_start, current_end + 1) if num in word_map] pyramid.append(row) # 更新下一层的起始数字 current_start = current_end + 1 level += 1 # 打印排序后的列表 print("Sorted List:") for num, word in sorted_tuples: print(f"{num} {word}") # 提取每行最后一个单词 last_words = [row[-1] for row in pyramid if row] return ' '.join(last_words) except ValueError: return "Invalid input. Please ensure each line starts with a valid number." # 示例调用 input_file_path = "text_file.txt" unscrambled_result = unscramble_lines_from_file(input_file_path) last_words_result = create_pyramid_from_unscrambled_lines(unscrambled_result) print("\nLast Words from Each Row:") print(last_words_result)
关键修改点
- 提前把每行拆成
(数字, 单词)的元组,用字典word_map快速查找数字对应的单词,减少重复操作。 - 用
while循环按层计算数字区间:- 第n层包含
level个数字,起始数字是上一层结束+1,结束数字是起始+level-1。比如第一层level=1:start=1,end=1;第二层level=2:start=2,end=3;第三层level=3:start=4,end=6。
- 第n层包含
- 收集当前层所有单词后,取
row[-1]就是该层最后一个单词,最终得到预期的chick select poem。
内容的提问来源于stack exchange,提问作者john_doe
相关产品推荐
相关产品推荐

