2016-02-22 2 views
-1

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

dict[["A1","A2"], 
    ["B1","B2"], 
    ["C1","C2"]] 

for i in range(len(dict)): 
    if dict[i][0]=="A1": 
     dict.pop(i) 

Но это дает мне ошибку за пределами допустимого диапазона. Как это сделать со списком или любым другим подходом?

+4

Почему у вас есть список списков, которые, по-видимому, называются 'dict' ?! – jonrsharpe

+0

Попробуйте создать новый список и примените изменения к этому – Arman

+0

, почему вы «должны»? – Jasper

ответ

3

Вы имеете в виду это?

old = [["A1","A2"], ["B1","B2"], ["C1","C2"]] 
new = [x for x in old if x[0] != "A1"] 
+0

Вы можете даже изменить исходный список на место, назначив его неограниченному фрагменту: 'old [:] = [x для x в old, если x [0]! =" A1 "]' будет мутировать исходный список '(важно в случае, когда исходный« список »был передан в качестве аргумента или в противном случае можно ссылаться со многих мест, и мутации должны рассматриваться всеми референтами). – ShadowRanger

+0

@ ShadowRanger: да, возможно, но в основном плохая идея. – georg

+0

Плохая идея? Зачем? Я имею в виду, в общем, это не то, что вы хотите сделать, и это вас мало приносит, но в общем случае это не является вредным для здоровья. Немного скрипучий в случае аргументов мутирующей функции (побочные эффекты являются неприятными, особенно если вы пытаетесь написать квазифункциональный код), но в других случаях это имеет смысл. Если есть, например, некоторый глобальный «список» модуля, и он должен быть мутирован, поэтому недействительный код приведет к тому, что код «из mymodule import mylist» потеряет связь с 'mylist' mymodule'. То же самое касается локального кэша, на который ссылаются переменные класса и т. Д. – ShadowRanger

1

Вы не можете. Вы получите исключение. Создайте новый список как копию.

>>> disallowed = [1, 2, 3] 
>>> my_list = [ [1, 2, 3, 4, 5, 6, 7], [3, 3, 4, 5, 8, 8, 2] ] 
>>> filtered_list = [[y for y in x if y not in disallowed] for x in my_list] 
>>> print filtered_list 
[[4, 5, 6, 7], [4, 5, 8, 8]] 
1

Вы можете фактически удалить из списка, пока вы итерацию над ней, если вы к нему в обратном направлении (так удаление влияет только на более высокие показатели, которые вы уже видели во время этой итерации):

data = [["A1","A2"], 
     ["B1","B2"], 
     ["C1","C2"]] 

for i, pair in reversed(data): 
    if pair[0] == 'A1': 
     del data[i]