5 def应用程序过滤器(L、f、g): """ 假设L是一个整数列表 假设函数f和g是为您定义的。 f接受一个整数,应用一个函数,返回另一个整数 g取整数,应用布尔函数, 返回True或False 对L进行变异,使得对于L中最初的每个元素,L都包含 如果g(f(i))返回True,则没有其他元素 如果列表为空,则返回经过变异的L或-1中的最大元素 """ #你的代码在这里 i=0 如果len(L)==0: 返回-1 而我,python,function,Python,Function" /> 5 def应用程序过滤器(L、f、g): """ 假设L是一个整数列表 假设函数f和g是为您定义的。 f接受一个整数,应用一个函数,返回另一个整数 g取整数,应用布尔函数, 返回True或False 对L进行变异,使得对于L中最初的每个元素,L都包含 如果g(f(i))返回True,则没有其他元素 如果列表为空,则返回经过变异的L或-1中的最大元素 """ #你的代码在这里 i=0 如果len(L)==0: 返回-1 而我,python,function,Python,Function" />

python函数的奇怪行为 我在Python的EDX的在线课程中,我必须做这个小程序,我认为函数是正确的,但是当一个元素从列表中删除,突然下一个元素不被考虑到测试中时,它就有了bug。 def f(i): return i + 2 def g(i): return i > 5 def applyF_filterG(L, f, g): """ Assumes L is a list of integers Assume functions f and g are defined for you. f takes in an integer, applies a function, returns another integer g takes in an integer, applies a Boolean function, returns either True or False Mutates L such that, for each element i originally in L, L contains i if g(f(i)) returns True, and no other elements Returns the largest element in the mutated L or -1 if the list is empty """ # Your code here i = 0 if len(L) == 0: return -1 while i < len(L): if not g(f(L[i])): del L[i] i += 1 return max(L) def(i): 返回i+2 定义g(i): 返回i>5 def应用程序过滤器(L、f、g): """ 假设L是一个整数列表 假设函数f和g是为您定义的。 f接受一个整数,应用一个函数,返回另一个整数 g取整数,应用布尔函数, 返回True或False 对L进行变异,使得对于L中最初的每个元素,L都包含 如果g(f(i))返回True,则没有其他元素 如果列表为空,则返回经过变异的L或-1中的最大元素 """ #你的代码在这里 i=0 如果len(L)==0: 返回-1 而我

python函数的奇怪行为 我在Python的EDX的在线课程中,我必须做这个小程序,我认为函数是正确的,但是当一个元素从列表中删除,突然下一个元素不被考虑到测试中时,它就有了bug。 def f(i): return i + 2 def g(i): return i > 5 def applyF_filterG(L, f, g): """ Assumes L is a list of integers Assume functions f and g are defined for you. f takes in an integer, applies a function, returns another integer g takes in an integer, applies a Boolean function, returns either True or False Mutates L such that, for each element i originally in L, L contains i if g(f(i)) returns True, and no other elements Returns the largest element in the mutated L or -1 if the list is empty """ # Your code here i = 0 if len(L) == 0: return -1 while i < len(L): if not g(f(L[i])): del L[i] i += 1 return max(L) def(i): 返回i+2 定义g(i): 返回i>5 def应用程序过滤器(L、f、g): """ 假设L是一个整数列表 假设函数f和g是为您定义的。 f接受一个整数,应用一个函数,返回另一个整数 g取整数,应用布尔函数, 返回True或False 对L进行变异,使得对于L中最初的每个元素,L都包含 如果g(f(i))返回True,则没有其他元素 如果列表为空,则返回经过变异的L或-1中的最大元素 """ #你的代码在这里 i=0 如果len(L)==0: 返回-1 而我,python,function,Python,Function,如果我尝试使用这个示例L=[0,-10,5,6,-4,-2],L的值应该是L=[5,6],但结果是[-10,5,6,-2]删除0时跳过元素-10,而-4和-2也会发生同样的情况。请帮助,我不知道如何解决这个问题。在迭代列表时对列表进行变异是个坏主意,会导致意外行为。一般来说,你最好创建一个新的列表来处理 在这种特定的情况下,可以通过简单的修改来修复代码。只有在不删除元素时才迭代索引,以免在列表中跳到前面 while i < len(L): if not g(f(L[i])):

如果我尝试使用这个示例L=[0,-10,5,6,-4,-2],L的值应该是L=[5,6],但结果是[-10,5,6,-2]删除0时跳过元素-10,而-4和-2也会发生同样的情况。请帮助,我不知道如何解决这个问题。

在迭代列表时对列表进行变异是个坏主意,会导致意外行为。一般来说,你最好创建一个新的列表来处理

在这种特定的情况下,可以通过简单的修改来修复代码。只有在不删除元素时才迭代索引,以免在列表中跳到前面

while i < len(L):
    if not g(f(L[i])):
        del L[i]
    else:
        i += 1
而i
问题:

在遍历列表时,您正在从列表中删除元素。因此,
i
不再引用列表中的正确元素

while i < len(L):
    if not g(f(L[i])):
        del L[i]
    else:
        i += 1
为了说明这个问题,下面是一个运行代码的示例。
在本例中,我们假设如果元素的值为偶数,if语句将删除该元素。
我还假设
I
已经初始化

L=[1,2,6,3,4]

迭代1 i==0,L[i]==1,我们不删除元素。
L==[1,2,6,3,4]

迭代2 i==1,L[i]==2,元素被删除。
L==[1,6,3,4]

迭代3 i==2,L[i]==3,我们不删除元素。
L==[1,6,3,4]
#你有没有注意到我们只是跳过了检查6,因为它的索引移动了

迭代4 i==3,L[i]==4,元素被删除。
L==[1,6,3]

我们完了!
有两种方法可以做到这一点。尽管@Meerness已经提供了一种方法来做到这一点,但为了完整起见,这里有另一种方法可以做到这一点

i = len(L) - 1
if i == -1:
    return -1

while i >= 0:
    if not g(f(L[i])):
        del L[i]
    i -= 1

工作原理:

通过这种方式,您可以从最顶端的索引开始倒计时。这样,删除元素不会影响尚未检查的元素的索引。
我对这种做法的解释是对@JohnColeman的评论稍加改写。
不过,在看到他的评论之前,我已经写了这个解决方案,所以我没有借用他的想法——我只是借用了他的解释。)

下面是一个我们倒计时而不是倒计时的例子:

L=[1,2,6,3,4]

迭代1 i==4,L[i]==4,元素被删除。
L==[1,2,6,3]

迭代2 i==3,L[i]==3,我们不删除元素。
L==[1,2,6,3]

迭代3 i==2,L[i]==6,元素被删除。
L==[1,2,3]

迭代4 i==1,L[i]==2,元素被删除。
L==[1,3]

迭代5 i==0,L[i]==1,我们不删除元素。
L==[1,3]

我们完了!

PS:使用python3脚本自动生成的示例:

在Python中,尽量不要遍历在循环中发生变化的列表。在本例中,删除元素后索引顺序发生了更改。在迭代之前,我创建了一个L的副本,它做到了这一点

def applyF_filterG(L, f, g):
    copied_L = L[:]
    for i in copied_L:
        if not g(f(i)):
            L.remove(i)
    if len(L)==0:
        return -1
    else:
        return  max(L)

长话短说:你永远不想在遍历列表时对其进行变异。如果你确实想在遍历列表时删除元素(尽管这通常不是一个好主意),最好的方法是从最大的索引开始,然后使用最小的索引。这样,当一个元素被删除时,它的删除不会改变你仍然需要访问的元素的任何索引。它解决了我的问题,非常感谢。我现在注意到了我的问题所在。此代码适用于任何情况,谢谢。我现在注意到我犯了什么错误。