【问题标题】:removing numbers from a list python [duplicate]从列表python中删除数字[重复]
【发布时间】:2015-09-19 03:28:17
【问题描述】:

尝试创建一个删除奇数的函数。当我运行这段代码时,它只打印出 [2,3,4,5,6,7,8,9]。这是因为第一次迭代后返回取消了我的循环吗?如果是这样,我该如何修改它以运行循环并打印出一个删除所有奇数的列表?

def evens(numbers):
    for i in range(len(numbers)):
        if numbers[i] % 2 != 0:
            del numbers[i]
        return numbers

numberlist = [1,2,3,4,5,6,7,8,9]

print evens(numberlist)

在你们都跳到对我重复的问题投反对票之前……我在问为什么我的特定代码被破坏了。这发现了一个有趣的问题,那就是在循环中使用 del 方法意味着您实际上需要反向迭代。

【问题讨论】:

    标签: python


    【解决方案1】:

    确实,您在第一个循环之后返回,将return 语句的缩进更改为少一个制表符。此外,您应该从列表的末尾迭代到开头,以免超出范围,因为您在迭代时正在修改列表(删除元素)。

    修改:

    def evens(numbers):
        for i in range(len(numbers), 0):
            if numbers[i] % 2 != 0:
                del numbers[i]
            return numbers
    

    到:

    def evens(numbers):
        for i in range(len(numbers)-1, -1, -1): # <-- change the iteration from end to beginning, in order not to run out of index range
            if numbers[i] % 2 != 0:
                del numbers[i]
        return numbers # <-- change in indentation
    

    输出

    [2, 4, 6, 8]
    

    【讨论】:

    • 实际上,你必须以相反的顺序进行迭代。否则del 语句将破坏预期的迭代顺序。
    • 是的,我认为这将是一个修复,但后来我得到一个列表索引超出范围错误??
    • 好消息@HuazuoGao - 已修复!
    • @Dude 看到上面的变化。
    • @Dude 通过删除您正在缩短列表的元素。如果你删除了索引 7,现在索引 8 变成了索引 7。这意味着当你从零迭代到全长并删除元素时,你会得到 index out of bounds 错误。解决方法是从头开始,如果您删除索引 8 并向后移动 - 索引 7 不会受到影响。
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多