6

プログラミングを始めたばかりで、練習のために Project Euler の問題を Python で解いています。(これは問題 2 で、400 万以内の偶数のフィボナッチ数の合計を見つけます。) 私の問題は、リスト内の奇数を見つけて削除しようとしている一番下のループに現れます。

del fiblist[i]次のエラーメッセージが表示されます。

トレースバック (最新の呼び出しが最後): ファイル ".../euler.py"、35 行目、del fiblist[i] 内 IndexError: リスト割り当てインデックスが範囲外

ここで何が間違っているのかわかりません。誰かが私がここで間違っていることを理解するのを手伝ってくれたら本当にありがたいです。

#euler2

def fibonacciList(limit):
    '''generates a list of fib numbers up to N'''
    mylist = []
    a,b = 1,2
    while True:
        if a <= limit:
            mylist.append(a)
            a,b = b,a+b
        else:
            break

    return mylist


fiblist = fibonacciList(4000000)

for i in fiblist:
    if i%2 != 0:    #if not even, delete from list
        print i
        del fiblist[i]

print fiblist
4

1 に答える 1

5

ここでの問題の 1 つiは、インデックスではなく、リストの項目であることです。したがって、del fiblist[i]削除するときはiではなく、インデックスにある値i(存在しないため、エラーが発生します) を削除します。これは、 を使用して使用するインデックスを取得することで修正できますがenumerate()、そうすると新しい問題が発生します。

ここでの主な問題は、Python の反復処理を台無しにするため、反復処理中にリストの長さを変更できないことです。1 つの解決策は、リストをコピーしてコピーで作業することですが、より良い方法は、リスト内包表記を使用して目的を実行することです。

[i for i in fiblist if i%2 == 0]

これにより、必要な要素のみを含む新しいリストが生成されます。リスト内包表記は強力なツールなので、リンク先のビデオをご覧になることをお勧めします。

于 2012-12-12T23:38:05.630 に答える