У меня есть список
a = ["a", "b", "c", "d", "e"]
Я хочу удалить элементы в этом списке в цикле for, как показано ниже:
for item in a:
print item
a.remove(item)
Но это не сработает. Что я могу сделать?
У меня есть список
a = ["a", "b", "c", "d", "e"]
Я хочу удалить элементы в этом списке в цикле for, как показано ниже:
for item in a:
print item
a.remove(item)
Но это не сработает. Что я могу сделать?
Вам не разрешается удалять элементы из списка, итерации по нему с помощью цикла for
.
Лучший способ переписать код зависит от того, что вы пытаетесь сделать.
Например, ваш код эквивалентен:
for item in a:
print item
a[:] = []
В качестве альтернативы вы можете использовать цикл while
:
while a:
print a.pop(0)
Я пытаюсь удалить элементы, если они соответствуют условию. Затем я перехожу к следующему пункту.
Вы можете скопировать каждый элемент, который соответствует условию, во второй список:
result = []
for item in a:
if condition:
result.append(item)
a = result
В качестве альтернативы вы можете использовать filter
или понимание списка и вернуть результат a
:
a = filter(lambda item:... , a)
или
a = [item for item in a if ...]
где ...
означает условие, которое вам нужно проверить.
Итерацию через копию цикла:
>>> a = ["a", "b", "c", "d", "e"]
>>> for item in a[:]:
print item
if item == "b":
a.remove(item)
a
b
c
d
e
>>> print a
['a', 'c', 'd', 'e']
Как говорили другие ответы, лучший способ сделать это - создать новый список - либо перебрать копию, либо создать список только с теми элементами, которые вы хотите, и назначить обратно той же переменной. Разница между ними зависит от вашего варианта использования, поскольку они влияют на другие переменные для исходного списка по-разному (или, скорее, первое влияет на них, второе - нет).
Если по какой-либо причине копия не является вариантом, у вас есть еще один вариант, который основан на понимании того, почему вы изменяете список, в котором вы выполняете перерывы. Список итераций работает, отслеживая индекс, увеличивая его каждый раз вокруг цикла, пока он не упадет с конца списка. Итак, если вы удаляете (или раньше) текущий индекс, все от этой точки до конца сдвигает одно пятно влево. Но итератор не знает об этом и фактически пропускает следующий элемент, так как теперь он находится в текущем индексе, а не в следующем. Однако удаление вещей, которые находятся после текущего индекса, не влияет на вещи.
Это означает, что если вы переименовываете список вперед, если вы удаляете элемент в текущем индексе, все его право сдвигает влево - но это не имеет значения, поскольку вы уже использовали все элементы для справа от текущей позиции, и вы двигаетесь влево - следующий элемент слева не изменяется при изменении, и поэтому итератор дает вам тот элемент, который вы ожидаете.
TL; ДР:
>>> a = list(range(5))
>>> for b in reversed(a):
if b == 3:
a.remove(b)
>>> a
[0, 1, 2, 4]
Однако создание копии обычно лучше с точки зрения упрощения чтения кода. Я только упоминаю эту возможность ради полноты.
Как создать новый список и добавить элементы, которые вы хотите в этот новый список. Вы не можете удалять элементы во время итерации через список
import copy
a = ["a", "b", "c", "d", "e"]
b = copy.copy(a)
for item in a:
print item
b.remove(item)
a = copy.copy(b)
Работает: чтобы избежать изменения списка, который вы выполняете, вы делаете копию a
, перебираете ее и удаляете элементы из b
. Затем вы скопируете b
(измененную копию) на a
.
Возможно, немного поздно ответить на это, но я только что нашел этот поток, и ранее я создал свой собственный код...
list = [1,2,3,4,5]
deleteList = []
processNo = 0
for item in list:
if condition:
print item
deleteList.insert(0, processNo)
processNo += 1
if len(deleteList) > 0:
for item in deleteList:
del list[item]
Это может быть долгий путь, но, похоже, работает хорошо. Я создаю второй список, который содержит только числа, относящиеся к элементу списка для удаления. Обратите внимание, что "вставка" вставляет номер позиции списка в позицию 0 и толкает остаток вдоль так, чтобы при удалении элементов список удалялся с самого большого числа назад до самого низкого числа, чтобы список оставался в последовательности.
Удалить функцию удаляет первый элемент в списке (0-й индексный элемент). На первой итерации цикла for вы начинаете с номера индекса 0, печатаете его. Когда вы переходите к индексу номер 1, у вас больше нет "a" в позиции индекса 0, но вместо этого вы используете "b". Итак, вы получите "c". Таким образом, этот фрагмент кода будет печатать элементы списка только с номерами индексов.