2015-01-23 2 views
0

Я нахожусь в Python, и я хочу удалить определенный элемент из списка, критерием удаления является то, что когда элемент содержит три элемента firsts null, он должен быть удален из основного списка. Это то, что я пытаюсь сделать:Как удалить определенный элемент из списка - Python

a = [[0, 0, 0, 1],[0, 0, 1, 1],[1, 1, 1, 1]] 
temp = [] 

for i in range(len(a)): 
    for j in range(len(a[i])): 
     if a[j][0] + a[j][1] + a[j][2] == 0: 
      temp = a.pop(j) 
      print temp 
     else: 
      print a 

     j += 1  
     i += 1 

И I'm получаю следующее сообщение об ошибке:

if a[j][0] + a[j][1] + a[j][2] == 0: 
IndexError: list index out of range 

Я понятия не имею, что I'm делаю неправильно ...

Благодаря!

+0

Переменная 'j' варьируется от 0 до 4, но у вас есть только 3 элемента в списке. – ForceBru

ответ

4

Вы можете использовать список понимание, чтобы отфильтровать подсписки

>>> a = [[0, 0, 0, 1],[0, 0, 1, 1],[1, 1, 1, 1]] 
>>> a = [i for i in a if any(i[:3])] 
>>> a 
[[0, 0, 1, 1], [1, 1, 1, 1]] 

Это в основном работает с использованием нарезка, чтобы получить элементы [0] через [2], затем использует any для проверки наличия ненулевых значений.

+0

Спасибо Кибер, он работает так, как мне было нужно! – cieslak

4

Все, что вам нужно это (диапазон в этом случае не требуется):

a = [[0, 0, 0, 1],[0, 0, 1, 1],[1, 1, 1, 1]] 
newList = [] 

for i in a: 
    if i[0] + i[1] + i[2] != 0: 
     newList.append(i) 

print newList 
+2

Нет, изменение списка, в котором вы выполняете цикл (например, удаление элементов), приведет к аналогичной ошибке к той, которую наблюдает OP. –

+0

Не рекомендуется изменять списки, которые вы выполняете. – Jkdc

+0

@ Alex Materlli @ Jkdc Совершенно верно ... исправлено. – Eithos

0

Если вы хотите избежать вызова метода any(), вы можете использовать conditional check с in operator.

a = [[0, 0, 0, 1],[0, 0, 1, 1],[1, 1, 1, 1]] 
b = [i for i in a if 1 in i[:3]] 
# [[0, 0, 1, 1], [1, 1, 1, 1]] 
Смежные вопросы