由于循环,列表越界

2024-04-26 13:18:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个函数,它可以查看列表并删除所有奇数。我有一个问题,我的循环是出了界,我不知道如何解决它,谁能帮忙?谢谢

def isEven(number):
    if(number % 2) == 0 and (number != 0):
        return True
    else:
        return False

def only_even(intList):
    for i in range(0, len(intList)):
        if(isEven(intList[i])) == False:
           del intList[i]
    return intList

print(only_even([5, 8, 17, 6, 0, 20, 3]))

Tags: and函数falsetruenumberonly列表return
3条回答
def only_even(intList):
    intList[:] = filter(isEven, intList)
    return intList

或者,如果不需要修改列表:

^{pr2}$

当您使用del时,您正在更改列表的长度,但是for循环试图迭代列表的原始长度,因此最终它将超出列表的边界。也就是说,len(intList)不会在每次for循环时求值。在

解决方法是从旧列表中创建一个新列表并返回,如下所示:

def only_even(intList):
    new_list = []
    for i in range(0, len(intList)):
        if isEven(intList[i]) == True:
            new_list.append(intList[i])
    return new_list

现在您的打印声明将起作用:

^{pr2}$

列表越界的原因是在缩小列表的同时迭代原始大小的范围!在

def only_even(intList):
    intList[:] = [i for i in intList if isEven(i)]
    return intList

我正在执行一个切片赋值[:],以保留变异和返回列表的确切语义。如果你只想返回列表,它甚至更短

^{pr2}$

您还可以简化is even函数,因为它已经计算为True/False

def isEven(number):
    return number % 2 == 0 and number != 0   # Why isn't 0 even?

相关问题 更多 >