2016-10-04 1 views
0

Я хочу написать цикл for, который проверяет две функции на list. Первый возвращает int, второй - boolean. Если boolean == False функция должна удалить элемент из списка, так что в конце после вызова функция L должна быть мутирована. Вот пример.False Итерация

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] назад, потому что, если i удаляется, i+1 превращается в i+2 из удаляемого элемента. Кто-нибудь знает, как это решить? Большое спасибо!

+0

'for i in L' вместо этого использования' для i в L [:] ', он будет итерировать, хотя это копия. –

+0

'[i for i in L if i + 2> 5]' также дает тот же результат, который вы ожидаете. –

ответ

5

Вы не должны удалять элементы из списка, итерации по нему. просто создайте новый список L1, равный L, и удалите элементы из 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] 

или что-то подобное?

+0

Функции - это просто примеры, они могут измениться. Вот почему я не могу быть более конкретным в цикле –

+0

Тогда вызовите функцию r = [a для a в L, если f (a) <= g()] Тем не менее она остается тем же. Вам нужно создать новый список, а не удалять элементы из списка, который вы просматриваете. После цикла вы можете назначить L = r. – Hannu

 Смежные вопросы

  • Нет связанных вопросов^_^