【问题标题】:False Iteration [duplicate]错误迭代[重复]
【发布时间】:2016-10-04 11:34:01
【问题描述】:

我想编写一个for 循环来测试list 上的两个函数。第一个返回一个 int,第二个返回一个 boolean。如果boolean == False 函数应该从列表中删除元素,那么最后在调用函数 L 之后应该已经发生了变异。这是一个例子。

def f(i):
    return i + 2

def g(i):
    return i > 5

L = [0, -10, 5, 6, -4]

def applyF_filterG(L, f, g):
    for i in L:
        if g(f(i)) == False:        
            L.remove(i)

L = [5, 6]

我的问题是,使用上面编写的函数,我得到了L = [-10, 5, 6],因为如果删除了ii+1 会因为删除的元素而变成i+2。有谁知道如何解决这个问题?非常感谢!

【问题讨论】:

  • for i in L 而不是这个使用for i in L[:],虽然它是副本,但它会迭代。
  • [i for i in L if i+2 > 5] 它也给出了您期望的相同结果。

标签: python list for-loop iteration


【解决方案1】:

您不应该在迭代列表时从列表中删除元素。 只需创建一个等于 L 的新列表 L1 并从 L 中删除元素并迭代 L1。

def f(i):
    return i + 2

def g(i):
    return i > 5

L = [0, -10, 5, 6, -4]

def applyF_filterG(L, f, g):
    L1 = list(L)
    for i in L1:
        if g(f(i)) == False:        
            L.remove(i)


applyF_filterG( L, f, g )

print L

【讨论】:

    【解决方案2】:

    你能通过生成另一个列表来简化这个吗:

    L = [0, -10, 5, 6, -4]
    r = [a for a in L if a <= 5]
    

    还是类似的?

    【讨论】:

    • 函数只是示例,可以更改。这就是为什么我不能在循环中更具体
    • 然后调用函数 r = [a for a in L if f(a)
    猜你喜欢
    • 2023-03-31
    • 2013-07-21
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多