Python MIT 6.00.1X

#python-2.7 #python-3.x

#python-2.7 #python-3.x

Вопрос:

У меня есть код, и я думаю, что он готов, у меня просто одна проблема, когда выполняется мой цикл, и я удаляю что-то из списка, он пропускает следующую переменную в списке, и я не могу понять, как сделать так, чтобы она не пропускала его. Я предполагаю, потому что следующая переменная равна 0, и цикл думает, что он уже сделал 0. Есть ли способ это исправить. Код ниже

 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
    """
    for i in L:
        if g(f(i)) == False:
           L.remove(i)
    return max(L)


L = [0, -10, 5, 6, -4]
print(applyF_filterG(L, f, g))
print(L)
  

Комментарии:

1. Уверен, что вы нарушаете кодекс чести, публикуя здесь, MIT предоставляет множество форумов для получения помощи, я бы посоветовал вам использовать их вместо публикации здесь.

Ответ №1:

Попробуйте скопировать все значения L в L_temp, чтобы не перепутать L при выполнении итераций и избежать пропуска значений при изменении списка. Должно быть что-то вроде этого

 def applyF_filterG(L, f, g):

    L_temp = L[:]    
    for i in L_temp:
        if g(f(i)) == False:
           L.remove(i)
    if len(L) == 0:
        return -1
    else:
        return max(L)
  

Ответ №2:

Более кратко:

 max(x for x in L if f(g(x)))
  

Чтобы изменить список:

 L[:] = [x for x in L if f(g(x))]
return max(L)
  

Ответ №3:

 def applyF_filterG(L, f, g):
    l = []
    if len(L) > 0:
        for i in L:
            if (g(f(i)) == True):
                l.append(i)
        L[:] = l
        if len(L) > 0:
            return max(L)
        else:
            return -1
    else:
        L[:] = l
        return -1
  

этот код работает