Подтвердить что ты не робот

Как удалить элементы списка в цикле for в Python?

У меня есть список

a = ["a", "b", "c", "d", "e"]

Я хочу удалить элементы в этом списке в цикле for, как показано ниже:

for item in a:
    print item
    a.remove(item)

Но это не сработает. Что я могу сделать?

4b9b3361

Ответ 1

Вам не разрешается удалять элементы из списка, итерации по нему с помощью цикла 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 ...]

где ... означает условие, которое вам нужно проверить.

Ответ 2

Итерацию через копию цикла:

>>> 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']

Ответ 3

Как говорили другие ответы, лучший способ сделать это - создать новый список - либо перебрать копию, либо создать список только с теми элементами, которые вы хотите, и назначить обратно той же переменной. Разница между ними зависит от вашего варианта использования, поскольку они влияют на другие переменные для исходного списка по-разному (или, скорее, первое влияет на них, второе - нет).

Если по какой-либо причине копия не является вариантом, у вас есть еще один вариант, который основан на понимании того, почему вы изменяете список, в котором вы выполняете перерывы. Список итераций работает, отслеживая индекс, увеличивая его каждый раз вокруг цикла, пока он не упадет с конца списка. Итак, если вы удаляете (или раньше) текущий индекс, все от этой точки до конца сдвигает одно пятно влево. Но итератор не знает об этом и фактически пропускает следующий элемент, так как теперь он находится в текущем индексе, а не в следующем. Однако удаление вещей, которые находятся после текущего индекса, не влияет на вещи.

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

TL; ДР:

>>> a = list(range(5))
>>> for b in reversed(a):
    if b == 3:
        a.remove(b)
>>> a
[0, 1, 2, 4]

Однако создание копии обычно лучше с точки зрения упрощения чтения кода. Я только упоминаю эту возможность ради полноты.

Ответ 4

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

Ответ 5

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.

Ответ 6

Возможно, немного поздно ответить на это, но я только что нашел этот поток, и ранее я создал свой собственный код...

    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 и толкает остаток вдоль так, чтобы при удалении элементов список удалялся с самого большого числа назад до самого низкого числа, чтобы список оставался в последовательности.

Ответ 7

Удалить функцию удаляет первый элемент в списке (0-й индексный элемент). На первой итерации цикла for вы начинаете с номера индекса 0, печатаете его. Когда вы переходите к индексу номер 1, у вас больше нет "a" в позиции индекса 0, но вместо этого вы используете "b". Итак, вы получите "c". Таким образом, этот фрагмент кода будет печатать элементы списка только с номерами индексов.