2

我试图创建一个查看列表并删除所有奇数的函数。我有一个问题,我的循环超出了界限,我不知道如何解决它,有人可以帮忙吗?谢谢

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]))
4

3 回答 3

2

列表超出范围的原因是您在缩小列表的同时迭代原始大小的范围!

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

我正在执行切片分配[:]以保留变异和返回列表的确切语义。如果您只想返回列表,它会更短

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

您还可以简化您的 is even 函数,因为它已经评估为 True/False

def isEven(number):
    return number % 2 == 0 and number != 0   # Why isn't 0 even?
于 2013-03-15T15:00:27.827 回答
2

当您使用 时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

现在您的打印语句将起作用:

>>> print(only_even([5, 8, 17, 6, 0, 20, 3]))
[8, 6, 20]
于 2013-03-15T15:17:41.460 回答
1
def only_even(intList):
    intList[:] = filter(isEven, intList)
    return intList

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

def only_even(intList):
    return list(filter(isEven, intList))
于 2013-03-15T15:03:46.117 回答