Python列表分段赋值异常:仅填充blocks_A[1]后停止无报错
问题分析
需求是将sorted_resistances列表按以下规则分配到blocks_A的29个(索引0到28)子列表中:
- 前12项放入
blocks_A[0] - 跳过接下来的12项,将再往后的12项放入
blocks_A[1] - 以此类推,直到
blocks_A[28]被填满12项
当前代码仅填充了blocks_A[1]就停止且无报错,核心问题出在循环逻辑和切片范围的错误上。
错误点拆解
- 切片范围错误:
初始w=11,Python切片s[z:w]遵循左闭右开规则,所以sorted_resistances[0:11]仅包含索引0到10的11个元素,永远无法触发blocks_A[x]长度达到12的条件,后续逻辑因此混乱。 - 循环迭代对象固定:
for y in sorted_resistances[z:w]的迭代器在循环启动时就已生成,循环内修改z和w不会让循环自动遍历后续切片,第一次切片遍历完成后循环直接结束,无法处理后续分块。 - 排序时机错误:
读取每行数据时都执行sorted(list_of_resistances)会重复排序,效率极低,应该在读取完所有数据后仅排序一次。 - 分块逻辑无法持续执行:
原代码依赖单轮切片遍历触发分块切换,但迭代器固定的问题导致无法持续遍历后续的目标区间。
修正后的代码
from math import * # 用列表推导式简化29个空列表的初始化 blocks_B = [[] for _ in range(29)] blocks_A = [[] for _ in range(29)] with open("file.txt") as file_in: list_of_resistances = [] for line in file_in: list_of_resistances.append(int(line)) # 读取完所有数据后统一排序 sorted_resistances = sorted(list_of_resistances) x = 0 while x < 29: # 计算当前块的起始/结束索引:每块取24*x到24*x+12的12项(跳过中间12项) start_idx = 24 * x end_idx = start_idx + 12 # 数据不足时终止循环,避免索引越界 if start_idx >= len(sorted_resistances): break # 直接截取对应区间的元素填充当前块 blocks_A[x] = sorted_resistances[start_idx:end_idx] # 若当前块不足12项(数据不够),终止循环 if len(blocks_A[x]) < 12: break x += 1 print(blocks_A) print(blocks_B)
代码说明
- 用列表推导式替代原while循环初始化容器,简洁高效。
- 将排序操作移至读取完所有数据后,避免重复排序的性能浪费。
- 使用while循环遍历每个块,直接计算目标区间并一次性填充,逻辑清晰,解决了原迭代器固定的问题。
- 增加边界判断,防止数据不足时出现索引越界问题。
内容的提问来源于stack exchange,提问作者Joao
相关产品推荐
相关产品推荐

