我想制作一个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
答案 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
在第一次迭代中,count
为0
,因此“问题”行有效:
newitem = signature[0] + signature[1] + signature[2]
由于signature
是一个3项列表,这没关系。现在,在第二次迭代中,count
为1
,因此这一行将有效地变为:
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]