该列表索引如何超出范围? (斐波纳契数运动)

时间:2012-04-13 10:58:49

标签: python list for-loop range

此代码应打印Fibonacci序列前十个数字中偶数的总和。

#Creates a list with the first ten Fibonacci numbers. 
l = [1,2]
for i in range(10):
    l.append(l[i]+l[i+1])

for i in l:
    #If an element of the Fibonacci list is uneven, replace it with zero.
    if l[i]%2 != 0:
        l[i] = 0

#Print the sum of the list with all even Fibonacci numbers. 
print sum(l)

当我执行此操作时,我得到:

  File "pe2m.py", line 6, in <module>
    if l[i]%2 != 0:
IndexError: list index out of range

我不知道它是如何超出范围的,有人可以澄清吗?

4 个答案:

答案 0 :(得分:3)

你的问题是for i in l:它没有给你索引,它给你列表元素。由于元素是整数,它们可能是有效的(前几个将是有效的)但它们没有您想要的值 - 您将不得不再次迭代一个范围。

答案 1 :(得分:2)

您正在遍历值而不是索引位置!

请改用以下代码:

#Creates a list with the first ten Fibonacci numbers. 
l = [1,2]
for i in range(10):
    l.append(l[i]+l[i+1])

for i in range(len(l)):
    #If an element of the Fibonacci list is uneven, replace it with zero.
    if l[i]%2 != 0:
        l[i] = 0

#Print the sum of the list with all even Fibonacci numbers. 
print sum(l)

答案 2 :(得分:2)

您无法使用列表中的值索引列表,因为无法保证该值将在列表边界内

看到你的代码,我觉得你打算做下面的事情

>>> for i,e in enumerate(l):
    #If an element of the Fibonacci list is uneven, replace it with zero.
    if e%2 != 0:
        l[i] = 0

有趣的是,你可以这样做。 (在看到glglgl的评论后编辑]

>>> print sum(e for e in l if e%2)

答案 3 :(得分:1)

Python的for x in y构造返回x中序列的值/元素,而不是它们的索引。

至于Fibonacci数:序列从1,1开始,而不是1,2,并且总和可以更简单地完成:

a, b = 1, 1
s = 0
for i in range(10):
    a, b = b, a+b
    if b % 2 = 0:
        s += b

print s

如果您需要获得前N个偶数的总和,您可以这样做:

a, b = 1, 1
s = 0
count = 0
while count < 10:
    a, b = b, a+b
    if b % 2 = 0:
        s += b
        count += 1

print s

只是为了实现带有函数式发电机的版本:

from itertools import islice
def fib():
    a, b = 1, 1
    yield a
    yield b
    while True:
        a, b = b, a+b
        yield b

even_sum = reduce(lambda x, y: x+y if y % 2 == 0 else x, islice(fib(), 10), 0)