
本文详解python中构建数字金字塔并准确提取每行末尾单词的完整实现,纠正常见索引逻辑错误,提供健壮、可复用的解决方案。
本文详解python中构建数字金字塔并准确提取每行末尾单词的完整实现,纠正常见索引逻辑错误,提供健壮、可复用的解决方案。
在处理类似“编号+单词”格式的文本(如 3 select\n2 paragraph\n5 always...)时,目标是将其按编号升序排序后,按三角形/金字塔层级(第1层1个元素、第2层2个、第3层3个……)组织,并提取每一层最后一个单词——而非每层第一个或任意错位元素。原始代码失败的根本原因在于:它错误地将“行号”(level)与“编号值”(number)混为一谈,并用 current_number += level 动态生成期望编号,导致无法匹配真实数据中的编号分布;同时,pyramid 构建方式未体现真正的金字塔结构,而是按编号逐个收集,破坏了层级语义。
正确的解法应分三步:解析映射 → 排序对齐 → 定位三角形边界。以下是优化后的专业实现:
def unscramble_and_extract_pyramid_words(file_path):
"""
从文件读取编号-单词对,构建金字塔并返回每层末尾单词序列
文件格式示例:'3 select\n2 paragraph\n5 always\n6 poem\n1 chick\n4 planet'
"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
lines = [line.strip() for line in f if line.strip()]
# 步骤1:解析为 {编号: 单词} 映射,并提取所有编号
num_word_map = {}
numbers = []
for line in lines:
parts = line.split(maxsplit=1) # 仅分割一次,避免单词含空格出错
if len(parts) < 2:
raise ValueError(f"Invalid line format: '{line}'")
num = int(parts[0])
word = parts[1].strip()
num_word_map[num] = word
numbers.append(num)
if not num_word_map:
return ""
# 步骤2:按编号升序排列单词列表(确保索引0对应最小编号)
max_num = max(numbers)
sorted_words = [num_word_map.get(i, "") for i in range(1, max_num + 1)]
# 步骤3:计算三角形第n层末尾位置(即前n层总元素数)→ 即第n层最后一个元素索引(0-based)
# 第1层末尾索引 = 1-1 = 0;第2层末尾索引 = (1+2)-1 = 2;第3层 = (1+2+3)-1 = 5...
def triangular_sum(n):
return n * (n + 1) // 2
result_words = []
layer = 1
while True:
last_index_in_layer = triangular_sum(layer) - 1 # 0-based index
if last_index_in_layer >= len(sorted_words):
break
if sorted_words[last_index_in_layer]: # 避免空字符串
result_words.append(sorted_words[last_index_in_layer])
layer += 1
return " ".join(result_words)
except FileNotFoundError:
return "Error: File not found."
except ValueError as e:
return f"Error: {e}"
except Exception as e:
return f"Unexpected error: {e}"
# 示例调用(假设 text_file.txt 内容为题目所给)
# print(unscramble_and_extract_pyramid_words("text_file.txt"))关键修正说明:
- ✅ 精准映射解析:使用 split(maxsplit=1) 确保单词部分不被二次分割(如单词含空格也能保留);显式构建 num_word_map 避免重复解析。
- ✅ 层级定位无误:利用三角形数公式 T(n) = n(n+1)/2 直接计算第 n 层末尾元素在全局有序列表中的0-based索引(如 T(1)-1=0, T(2)-1=2, T(3)-1=5),完全匹配金字塔结构:
Level 1: [chick] → index 0 Level 2: [paragraph, select] → index 2 → "select" Level 3: [planet, always, poem] → index 5 → "poem"
- ✅ 健壮性增强:异常分级处理(文件、格式、运行时);跳过空行;自动终止超出范围的层级遍历。
注意事项:
- 输入文件中编号必须为连续正整数(1, 2, 3,...),否则金字塔结构不成立;若存在缺失编号(如无4),需提前校验或填充占位符。
- 本方案时间复杂度为 O(N),远优于原始代码中多次遍历列表的 O(N²) 操作。
- 若需支持非连续编号的“稀疏金字塔”,应先重编号或使用动态层级划分算法——但此已超出题设场景。
运行示例输入,输出将严格为 chick select poem,完美符合预期。










