简体   繁体   English

我的“列表索引超出范围”问题在 PYTHON

[英]My "list index out of range" problem in PYTHON

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

My Sample input我的示例输入

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**

and my sample error和我的样本错误

line 23, in <module>
    pay=paymentsTable[i][k]+paymentsTable[k+1][j]
IndexError: list index out of range

The error message you attached is pretty clear:您附加的错误消息非常清楚:

in line 23, either paymentsTable[i][k] or paymentsTable[k+1][j] has an index out of range.在第 23 行中, paymentsTable[i][k]paymentsTable[k+1][j]的索引超出范围。

paymentsTable has exactly leng elements, so their valid indices go from 0 to leng-1 . paymentsTable恰好有leng个元素,因此它们的有效索引 go 从0到 leng leng-1

Every element paymentsTable[i] is also a list with exactly leng elements, so their valid indices also go from 0 to leng-1 .每个元素paymentsTable[i]也是一个包含恰好leng个元素的列表,因此它们的有效索引也是 go 从0到 leng leng-1

Now, i ranges inside range(leng) , but j is ranging over (range(1, leng + 1)) , which means the first value will be 1 and the last will be leng .现在, irange(leng)范围内,但j(range(1, leng + 1)) ,这意味着第一个值将为1 ,最后一个值为leng

Hence, in the last iteration of for j in range(1,leng+1) , j is leng and the last valid index of paymentsTable[i] was leng-1 , so you get the "IndexError: list index out of range"因此,在for j in range(1,leng+1)的最后一次迭代中, jleng并且paymentsTable[i]的最后一个有效索引是leng-1 ,所以你得到“IndexError:列表索引超出范围”

Moreover, k+1 also gets the value leng in the last iteration of that line, it is also out of range, considering that the last valid index of paymentsTable is also leng .此外, k+1也在该行的最后一次迭代中获得了值leng ,它也超出了范围,考虑到paymentsTable的最后一个有效索引也是leng

I haven't tried this yet but I think the problem is with the row assignment.我还没有尝试过,但我认为问题出在行分配上。 paymentsRow and idTableRow must be created outside the for a loop. paymentsRowidTableRow必须在 for 循环之外创建。 Your implementation means it loops through and appends, but after appending, it makes the list empty again.您的实现意味着它循环并追加,但在追加之后,它再次使列表为空。 So basically in your code, paymentsRow and idTableRow have only one element in them.所以基本上在您的代码中, paymentsRowidTableRow中只有一个元素。

[UPDATE] I integrated Rodrigo's solution with mine and no errors appeared. [更新] 我将 Rodrigo 的解决方案与我的解决方案集成在一起,没有出现任何错误。

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=[]
paymentsRow=[]
for i in range(leng):
    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):
        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=[]
idTableRow=[]

for i in range(leng):
    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):
        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):
        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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM