Python任务支付代码出现list index out of range错误求助
任务分段支付计算代码的索引越界问题排查与解决
问题描述
编写用于计算任务分段支付的Python代码时,遭遇list index out of range(列表索引越界)错误,以下是相关代码、输入及报错信息,需要排查并解决该问题。
原代码
total_task=float(input("Enter the assigned total task length(in half-hour(s)):")) total_len=total_task*2 leng=int(total_len) payments=[] hours=[] for i in range(leng): print("Enter the payment value( in TL) for task portion ID ",(i+1)," having length ",((i+1)*0.5)," hour(s):") portionLen=int(input()) payments.append(portionLen) hours.append(portionLen) paymentsTable=[] for i in range(leng): paymentsRow=[] for j in range(leng): paymentsRow.append(0) paymentsTable.append(paymentsRow) for i in range(leng): paymentsTable[i][i]=payments[i] for i in range(leng): for j in range(1,leng+1): maxPayment=0 for k in range(j): pay=paymentsTable[i][k]+paymentsTable[k+1][j] if(pay>maxPayment): maxPayment=pay paymentsTable[i][j]=maxPayment idTable=[] for i in range(leng): idTableRow=[] for j in range(leng): idTableRow.append(0) idTable.append(idTableRow) for i in range(leng): idTable[i][i]=i+1 for i in range(leng): for j in range(1,leng+1): maxPayment=0 for k in range(j): pay = paymentsTable[i][k] + paymentsTable[k + 1][j] if (pay > maxPayment): maxPayment = pay paymentsTable[i][j] = maxPayment for i in range(leng): for j in range(1,leng+1): maxPayment=0 for k in range(j): pay = paymentsTable[i][k] + paymentsTable[k + 1][j] if (pay > maxPayment): maxPayment = pay idTable[i][j]=k+1
示例输入
Enter the assigned total task length(in half-hour(s)):**2** Enter the payment value( in TL) for task portion ID 1 having length 0.5 hour(s): **100** Enter the payment value( in TL) for task portion ID 2 having length 1.0 hour(s): **400** Enter the payment value( in TL) for task portion ID 3 having length 1.5 hour(s): **500** Enter the payment value( in TL) for task portion ID 4 having length 2.0 hour(s): **600**
报错信息
line 23, in <module> pay=paymentsTable[i][k]+paymentsTable[k+1][j] IndexError: list index out of range
问题分析
- 索引越界核心原因:
原代码中paymentsTable和idTable被创建为leng x leng的二维列表(索引范围0到leng-1),但后续循环中j的取值范围是range(1, leng+1),当j=leng时,访问paymentsTable[k+1][j]会超出列表的最大索引(leng-1),直接触发索引越界错误。 - 输入逻辑错误:
hours.append(portionLen)这行代码错误地将支付金额添加到了时长列表hours中,实际应该添加对应分段的时长(i+1)*0.5。 - 冗余代码:
原代码重复了三次几乎完全相同的paymentsTable计算循环,属于无意义的冗余,既浪费资源又增加维护成本。
解决方案
- 调整二维列表维度:
将paymentsTable和idTable创建为(leng+1) x (leng+1)的二维列表,这样索引可以覆盖到j=leng的情况,匹配后续循环的取值范围。 - 修正输入逻辑:
修改hours列表的赋值语句,添加正确的分段时长。 - 移除冗余代码:
合并重复的计算逻辑,只保留一次核心的动态规划计算过程。
修改后的完整代码
total_task = float(input("Enter the assigned total task length(in half-hour(s)):")) total_len = total_task * 2 leng = int(total_len) payments = [] hours = [] # 修正输入逻辑,正确记录分段时长和支付金额 for i in range(leng): portion_hour = (i + 1) * 0.5 print(f"Enter the payment value( in TL) for task portion ID {i+1} having length {portion_hour} hour(s):") portion_pay = int(input()) payments.append(portion_pay) hours.append(portion_hour) # 创建(leng+1)x(leng+1)的二维列表,避免索引越界 paymentsTable = [[0]*(leng+1) for _ in range(leng+1)] # 初始化对角线值 for i in range(1, leng+1): paymentsTable[i][i] = payments[i-1] # 动态规划计算最大支付,只保留一次核心循环 for length in range(2, leng+1): # length表示子任务的分段数 for i in range(1, leng - length + 2): j = i + length - 1 maxPayment = 0 for k in range(i, j): current_pay = paymentsTable[i][k] + paymentsTable[k+1][j] if current_pay > maxPayment: maxPayment = current_pay paymentsTable[i][j] = maxPayment # 创建(leng+1)x(leng+1)的idTable idTable = [[0]*(leng+1) for _ in range(leng+1)] # 初始化对角线值 for i in range(1, leng+1): idTable[i][i] = i # 重新计算并记录分割点 for length in range(2, leng+1): for i in range(1, leng - length + 2): j = i + length - 1 maxPayment = 0 for k in range(i, j): current_pay = paymentsTable[i][k] + paymentsTable[k+1][j] if current_pay > maxPayment: maxPayment = current_pay idTable[i][j] = k # 可以添加结果输出,例如打印最大支付和分割点 print(f"Maximum total payment: {paymentsTable[1][leng]} TL") print("Task split points:", idTable[1][leng])
内容的提问来源于stack exchange,提问作者DonKirsolft
相关产品推荐
相关产品推荐

