Python执行列表元素存在判断时出现int不可迭代TypeError报错
报错原因
- 核心错误来自第32行的赋值逻辑错误:你初始定义
covered是长度等于木板数量的列表,用来标记每块木板是否被钉住,但代码中写的是if nail in intervals[j]: covered=1,直接把整个covered变量重写为整数1。下一轮while循环执行0 in covered判断时,需要对covered做迭代检查成员,而整数是不可迭代类型,因此触发TypeError: argument of type 'int' is not iterable。 - 你在终端执行
not (0 in covered)得到False是执行时机导致的:该命令是在covered还没有被错误重写为整数时运行的,此时covered仍为列表类型,因此可以正常做成员检查。
修复方案
- 修正覆盖状态的赋值逻辑,把整行
if nail in intervals[j]: covered=1改为if nail in intervals[j]: covered[j] = 1,仅修改对应下标木板的覆盖标记,不要重写整个covered变量。 - 补充最优钉子的取值逻辑:你遍历完所有钉子找到覆盖最多木板的
maxIndex后,没有重新读取对应位置的钉子值,内层遍历结束后nail变量存储的是最后一次遍历的钉子值,不是选中的最优钉子,需要在nails.append(maxIndex)之后新增一行nail = C[maxIndex],否则后续覆盖判断会使用错误的钉子值。
修复后的完整代码如下:
def NailingPlanks(A,B,C): numInervals = len(A) maxNails = len(C) intervals = [] covered = [0]*numInervals for i in range(numInervals): interval = [] for j in range(A[i],B[i]+1): interval.append(j) intervals.append(interval) nails = [] nailUsed = [False] * maxNails print('covered = ', covered) while (0 in covered): MaxCovered = 0 maxIndex = -1 for i in range(maxNails): if not nailUsed[i]: nail = C[i] cnt = 0 for j in range(numInervals): if covered[j]==0 and nail in intervals[j]: cnt += 1 if cnt>MaxCovered: MaxCovered = cnt maxIndex = i if maxIndex == -1: # 没有钉子能覆盖剩余木板,提前退出避免死循环 return -1 nails.append(maxIndex) nailUsed[maxIndex] = True nail = C[maxIndex] # 补充取选中的钉子值 for j in range(numInervals): if covered[j] == 0 and nail in intervals[j]: covered[j] = 1 # 修正赋值逻辑 print('nails=', nails) return len(nails)
额外优化说明:新增了无可用钉子时的提前退出逻辑,避免出现剩余木板无法被任何钉子覆盖时的死循环问题。
内容的提问来源于stack exchange,提问作者OtagoHarbour
相关产品推荐
相关产品推荐

