Bentley4
Bentley4

Reputation: 11028

How is this list index out of range? (Fibonacci numbers exercice)

This code should print the sum of the even numbers in the first ten numbers of the Fibonacci sequence.

#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)

When I execute this I get:

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

I don't get how its going out of range, could someone clarify?

Upvotes: 0

Views: 1024

Answers (4)

Abhijit
Abhijit

Reputation: 63727

You cannot index a list with the value from the list as it is not guaranteed that the value will be within the list boundary

Seeing your code, I feel you are planning to do something as below

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

Interestingly you can do the same as below. (Edited after seeing glglgl's comment]

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

Upvotes: 2

mensi
mensi

Reputation: 9826

Python's for x in y construct returns the values/elements of a sequence in x, not their index.

As for the Fibonacci numbers: The sequence starts with 1, 1 and not 1, 2. And the sum can be done simpler like this:

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

print s

If you need to get the sum of the first N even numbers, you would do:

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

And just for fun the version with generators in a functional style:

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)

Upvotes: 1

cfedermann
cfedermann

Reputation: 3284

You are looping over the values not the index positions!

Use the following code instead:

#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)

Upvotes: 2

Andrew Aylett
Andrew Aylett

Reputation: 40710

Your problem is for i in l: it doesn't give you the indices, it gives you the list elements. As the elements are integers, they could be valid (and the first few will be) but they don't have the values you want -- you'll have to iterate over a range again.

Upvotes: 3

Related Questions