列表中的迭代删除(Python 2)

zxz*_*zxz 6 python iteration fibonacci

我刚刚开始编程,我正在用Python解决Project Euler问题.(这是问题#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
Run Code Online (Sandbox Code Playgroud)

Gar*_*tty 5

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

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

[i for i in fiblist if i%2 == 0]
Run Code Online (Sandbox Code Playgroud)

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