2015-03-05 1 views
2

Я пытаюсь удалить элементы с нечетным индексом из моего списка (где нуль считается четным), но удаление их таким образом не будет работать, потому что оно отменяет значения индекса.Удалить элементы с нечетным индексом из списка в Python

lst = ['712490959', '2', '623726061', '2', '552157404', '2', '1285252944', '2', '1130181076', '2', '552157404', '3', '545600725', '0'] 


def remove_odd_elements(lst): 
    i=0 
    for element in lst: 
     if i % 2 == 0: 
      pass 
     else: 
      lst.remove(element) 
     i = i + 1 

Как я могу перебирать список и удалять эти нечетные элементы?

+0

Удовлетворяющий факт: удалить все четные (позиционированные) элементы, которые вы можете выполнить: 'для x в lst: lst.remove (x)'. Чтобы удалить все коэффициенты, выполните следующие действия: 'iter_lst = iter (lst); Следующий (iter_lst); для x в iter_lst: lst.remove (x) '. Итак, в основном, удаление 'if' решает проблему ... Надеюсь, мне не нужно говорить, чтобы никогда не использовать этот материал в реальном коде. – Bakuriu

ответ

9

Вы можете удалить все нечетные элементы на одном дыхании с помощью slice:

del lst[1::2] 

Демо:

>>> lst = ['712490959', '2', '623726061', '2', '552157404', '2', '1285252944', '2', '1130181076', '2', '552157404', '3', '545600725', '0'] 
>>> del lst[1::2] 
>>> lst 
['712490959', '623726061', '552157404', '1285252944', '1130181076', '552157404', '545600725'] 

Вы не можете удалять элементы из списка, пока вы итерации над ним, потому что списком итератор не корректируется при удалении элементов. См. Loop "Forgets" to Remove Some Items, что происходит, когда вы пытаетесь.

Альтернативой было бы построить новый список объектов для замены старого, используя list comprehension с enumerate() обеспечивая показатели:

lst = [v for i, v in enumerate(lst) if i % 2 == 0] 

Это сохраняет четные элементы, а не удалить нечетные элементы.

+0

Охх, поэтому обозначение в основном означает [начало: конец: шаг] – avereux

1

Так как вы хотите, чтобы устранить нечетные элементы и сохранить даже те вы можете использовать фильтр следующим образом:

>>>filtered_lst=list(filter(lambda x : x % 2 ==0 , lst)) 

этот подход имеет накладные расходы на создание нового списка.