6

我刚刚开始编程,我正在用 Python 解决 Project Euler 问题以进行练习。(这是问题 #2,找到 400 万以内的偶数斐波那契数之和。)我的问题出现在底部的循环中,我试图在列表中找到奇数,然后删除它们。

del fiblist[i]给我以下错误信息:

回溯(最后一次调用):文件“.../euler.py”,第 35 行,在 del fiblist[i] IndexError: list assignment index out of range

我看不出我在这里做错了什么,如果有人能帮我看看我在这里做错了什么,我将不胜感激。

#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

这里的一个问题是i列表中的项目,而不是索引。因此,当您这样做时,del fiblist[i]您不是在删除i,而是在索引处的值i(不存在,因此会出现错误)。这可以通过使用enumerate()来修复索引来使用,但是这样做会带来一个新问题。

这里的主要问题是在迭代列表时不能修改列表的长度,因为它会与 Python 的迭代相混淆。一种解决方案是复制列表并处理副本,但更好的方法是使用列表推导来执行您想要的操作:

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

这会生成一个新列表,其中仅包含您想要的元素。列表推导是一个强大的工具,因此我建议您观看我链接的视频以获取更多信息。

于 2012-12-12T23:38:05.630 回答