Python:列出索引超出范围而/ for循环

时间:2018-01-02 12:45:25

标签: python list concatenation indexoutofrangeexception

我想制作一个Tribonacci序列。 (每个新项目都是该列表中前三项的总和。)但是每当我使用while / for循环时,它都会显示列表索引超出范围错误。任何人都可以弄清楚这段代码有什么问题吗?

def tribonacci(signature, n):
    count = 0
    newlist = []
    while (len(newlist)<=n):
        newitem = signature[count]+signature[count+1]+signature[count+2]
        newlist.append(newitem)
        count = count+1
    print signature + newlist
tribonacci([1,1,1], 5)

在上面的代码中,我的预期输出是[1,1,1,3,5,9,17,31]

Traceback (most recent call last):
File "C:\Users\Vasanth\Desktop\sample.py", line 9, in <module>
tribonacci([1,1,1], 5)
File "C:\Users\Vasanth\Desktop\sample.py", line 5, in tribonacci
newitem = signature[count]+signature[count+1]+signature[count+2]
IndexError: list index out of range

6 个答案:

答案 0 :(得分:3)

在第一次迭代后,您将计数增加到1,但未以任何方式更新signature。它包含3个项目,因此count + 2将尝试将列表索引到其边界之外。

相反,您可以将您追加新结果的列表的最后3项加起来:

In [20]: def tribonacci(signature, n):
    ...:     result = list(signature)
    ...:     for _ in range(n):
    ...:         result.append(sum(result[-3:]))
    ...:     return result

或者,如果使用Python 3并希望创建一个生成器:

In [34]: from collections import deque
    ...: 
    ...: def tribonacci(signature, n):
    ...:     state = deque(signature, maxlen=3)
    ...:     yield from state
    ...:     
    ...:     for _ in range(n):
    ...:         next_value = sum(state)
    ...:         yield next_value
    ...:         state.append(next_value)
    ...: 

In [35]: tribonacci([1,1,1], 5)
Out[35]: <generator object tribonacci at 0x7f6ae11ef990>

In [36]: list(_)
Out[36]: [1, 1, 1, 3, 5, 9, 17, 31]

答案 1 :(得分:2)

简单的解决方案

def tri(original_sig, n):
    sig = original_sig.copy()
    for i in range(n):
        sig.append(sum(sig[i:i+3]))
    return sig

在您的代码中,您要将新值附加到newlist,而不是signature。因此,在第一次迭代后,您的代码将尝试访问元素3,这超出了ist的大小

答案 2 :(得分:2)

让我们将其减少为MCVE:

signature = [1, 1, 1]
count = 0
while True:
    newitem = signature[count] + signature[count+1] + signature[count+2]
    count = count+1

在第一次迭代中,count0,因此“问题”行有效:

    newitem = signature[0] + signature[1] + signature[2]

由于signature是一个3项列表,这没关系。现在,在第二次迭代中,count1,因此这一行将有效地变为:

    newitem = signature[1] + signature[2] + signature[3]

由于signature只有3个项目,因此没有signature[3]个对象 - 您的索引是OutOfRange。

答案 3 :(得分:0)

item = [1,1,1]
for i in range(5):
    new = item[i]+item[i+1]+item[i+2]
    item.append(new)
print item

答案 4 :(得分:0)

def tribonacci(signature, n):
    count = 0
    newlist = []
    while (len(newlist)<=n):
        newitem = signature[count]+signature[count+1]+signature[count+2]
        newlist.append(newitem)
        count = count+1
        signature.append(newitem)
    print signature
tribonacci([1,1,1], 5)
  

您每次都在增加计数器的值,但是您要将新值附加到签名列表中。   所以签名仍然只有3   当代码试图获取签名列表的第4个元素时,它会抛出此错误。

答案 5 :(得分:0)

对相关原始代码的小修改效果很好:

def tribonacci(signature, n):
    count = 0
    newlist = signature             # change here..
    while (len(newlist)<=(n+3)):    # here..
        newitem = signature[count]+signature[count+1]+signature[count+2]
        newlist.append(newitem)
        count = count+1
    print(newlist)                  # and here.

测试:

tribonacci([1,1,1], 5)
tribonacci([2,2,2], 5)

输出:

[1, 1, 1, 3, 5, 9, 17, 31, 57]
[2, 2, 2, 6, 10, 18, 34, 62, 114]

编辑:如评论中所述,发送的原始列表将在此处进行修改。

如果要保留原始列表:

def tribonacci(signature, n):
    count = 0
    newlist = signature.copy()      # get a copy of original list
    while (len(newlist)<=(n+3)):    
        newitem = newlist[count]+newlist[count+1]+newlist[count+2] # use newlist rather than signature
        newlist.append(newitem)
        count = count+1
    print(newlist)

测试:

a = [1,1,1]
tribonacci(a, 5)
print(a)

b = [2,2,2]
tribonacci(b, 5)
print(b)

输出:

[1, 1, 1, 3, 5, 9, 17, 31, 57]
[1, 1, 1]
[2, 2, 2, 6, 10, 18, 34, 62, 114]
[2, 2, 2]