2013-03-15 2 views
2

im пытается сделать функцию, которая просматривает список и удаляет все нечетные числа. У меня проблема, когда моя петля выходит за границы, и я не уверен, как ее исправить, может ли кто-нибудь помочь? БлагодаряСписок за пределами цикла

def isEven(number): 
    if(number % 2) == 0 and (number != 0): 
     return True 
    else: 
     return False 

def only_even(intList): 
    for i in range(0, len(intList)): 
     if(isEven(intList[i])) == False: 
      del intList[i] 
    return intList 

print(only_even([5, 8, 17, 6, 0, 20, 3])) 
+3

Каким нуля странный? – NPE

ответ

2

при использовании del, вы изменяете длину списка, но 0 Циклпытается перебрать исходную длину списка, поэтому, в конце концов, он выйдет за пределы списка. То есть len(intList) не оценивается каждый раз for.

Решение этой проблемы было бы создать новый список из старого списка и вернуться, что, например, так:

def only_even(intList): 
    new_list = [] 
    for i in range(0, len(intList)): 
     if isEven(intList[i]) == True: 
      new_list.append(intList[i]) 
    return new_list 

Теперь ваш оператор печати будет работать:

>>> print(only_even([5, 8, 17, 6, 0, 20, 3])) 
[8, 6, 20] 
2

Причина список выходит за пределы, потому что вы перебор в диапазоне от исходного размера в то время как сокращение списка!

def only_even(intList): 
    intList[:] = [i for i in intList if isEven(i)] 
    return intList 

Я делаю назначение ломтика [:] сохранить точную семантику мутирует и возвращает список. Если вы просто хотите, чтобы вернуть список его еще короче

def only_even(intList): 
    return [i for i in intList if isEven(i)] 

Вы также можете упростить ваши даже функция, так как она уже имеет значение True/False

def isEven(number): 
    return number % 2 == 0 and number != 0 # Why isn't 0 even? 
+0

Спасибо, что нашли время, чтобы объяснить каждый шаг и упростить функцию iseven:) – h1h1

1
def only_even(intList): 
    intList[:] = filter(isEven, intList) 
    return intList 

Или, если вы не «т нужно изменить список на месте:

def only_even(intList): 
    return list(filter(isEven, intList)) 
+0

Вы знаете, фильтр медленнее, чем понимание списка, не так ли? :) –

+0

Независимо от того, что быстрее (я не тестировал), что заставляет вас думать, что это даже актуально? ;) – NPE

+0

@gnibbler: только что протестировали их на Python 2.7.3, и они находятся в пределах 10% друг от друга. – NPE

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