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

Python分块赋值时while循环未按预期终止(无限循环)问题

无限循环问题修复方案

你的代码存在几个关键问题,导致blocks_A[28]永远无法填满,陷入无限循环:

  1. 循环内变量被反复重置:每次进入while len(blocks_A[28]) < 12循环时,z、w、x都会被重新赋值为0、11、0,相当于每次都在重复处理sorted_resistances的前11个元素,完全不会往后推进。
  2. 切片范围错误:Python的切片是左闭右开的,sorted_resistances[z:w]当w=11时,只会取到索引0到10的11个元素,永远凑不够12个,导致if len(blocks_A[x]) == 12永远不成立,x、z、w根本不会更新。
  3. 排序时机不合理:每次读取一行就排序一次,既浪费性能又没必要,应该等所有数据读取完成后统一排序。
  4. 存在冗余代码:blocks_B的定义和后续逻辑完全无关,属于无效代码。

修复后的代码

# 直接创建包含29个空列表的blocks_A,替代繁琐的while循环初始化
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)

    current_block = 0
    # 依次填充每个block,直到填满29个
    while current_block < 29:
        # 按照需求:每个block取12个元素,中间跳过12个,所以起始索引是current_block * 24
        start_idx = current_block * 24
        end_idx = start_idx + 12
        # 把对应范围的元素添加到当前block
        blocks_A[current_block].extend(sorted_resistances[start_idx:end_idx])
        # 如果不需要再排序(原列表已经是有序的,子列表自然有序),可以删掉下面这行
        blocks_A[current_block].sort()
        current_block += 1

print(blocks_A)

关键修复点说明

  • 初始化优化:用[[] for _ in range(29)]直接生成29个空列表,比原代码的while循环简洁高效。
  • 变量持久化:current_block在循环外初始化,每次循环后递增,确保能依次处理每个block,不会重置。
  • 正确的元素选取逻辑:start_idx = current_block * 24完美匹配“前12个给A[0],跳过12个,取接下来12个给A[1]”的需求,start_idx:end_idx正好取12个元素。
  • 性能优化:仅排序一次,避免重复排序的开销。
  • 清理冗余代码:移除了无用的blocks_B相关代码。

内容的提问来源于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:10:43