0

このコードは、フィボナッチ数列の最初の10個の偶数の合計を出力する必要があります。

#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

インデックス位置ではなく値をループしています!

代わりに次のコードを使用してください。

#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 に答える
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 に答える
1

Pythonのfor x in y構造は、インデックスではなく、xのシーケンスの値/要素を返します。

フィボナッチ数について:シーケンスは1、2ではなく1、1で始まります。合計は、次のように簡単に行うことができます。

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 に答える