You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:00:26