列出因循环而超出界限

时间:2013-03-15 14:54:20

标签: python loops bounds

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

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

3 个答案:

答案 0 :(得分: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)]

你也可以简化你的偶数函数,因为它已经计算为True / False

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

答案 1 :(得分: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语句将起作用:

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

答案 2 :(得分:1)

def only_even(intList):
    intList[:] = filter(isEven, intList)
    return intList

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

def only_even(intList):
    return list(filter(isEven, intList))