2017-02-15 14 views
0

У меня есть список таких, как это:Получение индекса из диапазона Погрешность при попытке удалить элемент списка

l = ['(7 - 3)', '7 - 6', '(a + 13)'] 

Я хочу, чтобы удалить любое выражение, которое не содержит букву "a" поэтому единственное выражение, которое будет Осталось ['(a+13)']. До сих пор я попытался это:

for i in range(len(l)): 
    if "a" not in l[i]: 
     l.pop(i) 
else: 
    print(l[i]) 

Однако я получаю индекс списка из ошибок диапазона, и не знаю, как это исправить.
Может ли кто-нибудь помочь в решении этого вопроса?

+0

Когда появляется элемент из список вы уменьшаете размер списка, в то время как цикл for сохраняет старую длину. Я бы предложил использовать второй список для pop from. –

+0

Я бы предложил новый подход и создал новый список.добавление() элементы, которые содержат __do__ 'а': новые = [] # вы использовали 'L' для '' CurrentList для г в CurrentList: , если "а" в I: new.append (I) –

ответ

1

Никогда не структурно манипулируйте list, итерации по нему! Используйте условное понимание

l = [x for x in l if 'a' in x] 

или filter:

l = filter(lambda x: 'a' in x, l) 
# in Python3, you will have to convert the filter object to a list 
# l = list(filter(lambda x: 'a' in x, l)) 
3

l.pop() удаляет элементы из списка, так что ваш список становится все меньше, но вы не регулируя итерации.

>>> x = [1,2,3] 
>>> x.pop(0) 
1 
>>> x 
[2, 3] 
>>> x.pop(1) 
3 
>>> x 
[2] 
>>> x.pop(2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: pop index out of range 

Я предлагаю вам использовать другой подход. Вы можете напрямую перебирать элементы списка и печатать те, которые содержат в них "a".

for i in l: 
    if "a" in i: 
    print(i) 

Если вам нужен список, чтобы иметь только те элементы, которые имеют "a" в них в конце вашей итерации, возможно, вы хотели бы добавить эти элементы в новый список.

things_with_a_in_them = [] 
for i in l: 
    if "a" in i: 
    things_with_a_in_them.append(i) 
    print(i) 

Если вы хотите быть terser ...

things_with_a_in_them = [i for i in l if "a" in i] 
map(print, things_with_a_in_them) 

Весело играя с различными подходами.

1

Проблема len(l) возвращает 3, но как только вы поместите элемент, ваш список станет короче. Проще всего сделать (если ваш список не запредельно гигант) было бы просто написать новый список:

l_new = [i for i in l if "a" in i] 
0

Если вы не хотите, чтобы создать новый list, и сохранить свою логику с pop, вы должны проверить на len(l) каждый раз, вы можете сделать это:

l = ['(7 - 3)', '7 - 6', '(a + 13)'] 

i = 0 
while i < len(l): 
    if "a" not in l[i]: 
     l.pop(i) 
    else: 
     print(l[i]) 
     i += 1 

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

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

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