0

此代码应打印斐波那契数列的前十个数字中的偶数之和。

#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

4 回答 4

3

你的问题是for i in l:它没有给你索引,它给你列表元素。由于元素是整数,它们可能是有效的(前几个是有效的)但它们没有你想要的值——你必须再次遍历一个范围。

于 2012-04-13T11:00:26.930 回答
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)
于 2012-04-13T11:02:18.437 回答
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)
于 2012-04-13T11:01:48.757 回答
1

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

至于斐波那契数:序列从 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)
于 2012-04-13T11:05:39.907 回答