如何从列表高效构建金字塔型嵌套列表(List of Lists)?
优化思路与实现方案
核心逻辑:利用数学规律简化迭代
金字塔的第k行(从1开始计数)包含k个元素,前k-1行的总元素数为 1+2+...+(k-1) = k*(k-1)/2。基于这个规律,我们可以直接通过计算切片边界来分割有序列表,替代原代码的手动迭代与异常捕获,让逻辑更清晰、效率更高。
优化实现(迭代版)
sorted_keys = sorted(encoded_message.keys()) pyramid = [] total = len(sorted_keys) start_idx = 0 row_length = 1 while start_idx + row_length <= total: # 直接切片提取当前行的元素 pyramid.append(sorted_keys[start_idx:start_idx + row_length]) start_idx += row_length row_length += 1
更紧凑的推导式写法
如果偏好简洁代码,可以先通过数学公式计算总行数,再用列表推导式生成结果:
sorted_keys = sorted(encoded_message.keys()) total = len(sorted_keys) # 解一元二次方程,计算最大完整行数m max_rows = int((-1 + (1 + 8 * total)**0.5) // 2) # 按每行的起始/结束索引切片 pyramid = [sorted_keys[k*(k-1)//2 : k*(k+1)//2] for k in range(1, max_rows + 1)]
优化点说明
- 去掉了原代码中
try-except的异常捕获开销,改用列表切片(底层为C实现,执行效率更高) - 逻辑完全基于金字塔的数学规律,可读性更强,减少冗余临时变量(如原代码的
row、go) - 避免了手动逐个元素添加的操作,直接批量提取数据,代码更简洁
内容的提问来源于stack exchange,提问作者Nprivette
相关产品推荐
相关产品推荐

