2012-04-13 15 views
0

Dieser Code sollte die Summe der geraden Zahlen in den ersten zehn Zahlen der Fibonacci-Folge drucken.Wie ist dieser Listenindex außerhalb des Bereichs? (Fibonacci numbers exercice)

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

Wenn ich dies auszuführen, erhalte ich:

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

ich nicht, wie seine außerhalb der Reichweite geht, könnte jemand erklären?

Antwort

2

Sie durchlaufen die Werte, nicht die Indexpositionen!

Verwenden Sie stattdessen den folgenden Code:

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

Vielen Dank, klare Erklärung! Das Ergebnis war immer noch nicht das, was ich wollte, weil ich Range (10-2) machen musste, wenn ich nur die ersten zehn Nummern wollte. – Bentley4

3

Ihr Problem ist for i in l: es gibt Ihnen die Indizes nicht, es gibt Ihnen die Listenelemente. Da die Elemente Ganzzahlen sind, könnten sie gültig sein (und die ersten werden es sein), aber sie haben nicht die Werte, die Sie wollen - Sie müssen erneut über einen Bereich iterieren.

2

Sie können nicht Index eine Liste mit dem Wert aus der Liste, da es nicht, dass der Wert

Sehen Sie den Code innerhalb der Liste Grenze wird gewährleistet, Ich glaube, Sie planen, etwas wie unten zu tun

Interessanterweise können Sie das gleiche wie unten tun. (Herausgegeben nach glglgl Kommentar sehen]

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

oder einfach 'sum (e für e in l wenn e% 2)'. – glglgl

+0

@glglgl: Ja, das sollte so sein, wie es gemacht werden sollte – Abhijit

1

Pythons for x in y Konstrukt gibt die Werte/Elemente einer Sequenz in x, nicht ihren Index

Was die Fibonacci-Zahlen. Die Folge beginnt mit 1, 1 und nicht 1, 2 und kann die Summe dieser einfacher wie geschehen:

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

print s 

Wenn Sie die Summe der ersten N gerade Zahlen bekommen müssen, würden Sie:

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 

Und nur so zum Spaß der Version mit Generatoren in einem funktionalen Stil:

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) 
Verwandte Themen