Как удалить элементы из списка во время его итерации, не пропуская будущие итерации [дубликат]Python

Программы на Python
Anonymous
Как удалить элементы из списка во время его итерации, не пропуская будущие итерации [дубликат]

Сообщение Anonymous »

В Python я заметил, что если я перебираю список с помощью for x в y и удаляю элемент y в цикле, последний элемент будет «пропущен» - Я предполагаю, что это связано с изменением len(y).
Я пытаюсь получить все файлы с определенным расширением, кроме тех, которые соответствуют некоторым условиям.< /p>
Вот исходный код:

Код: Выделить всё

def test_print_numTXTs(fileList):
counter = 0
for file in fileList:
if file.name[-4:] == ".txt":
counter +=1
if file.name == "a.txt":
fileList.remove(file)   #problem caused here
print(counter)
print(len(fileList))
Вывод счетчика на единицу меньше общего количества файлов .txt. Пройдя через отладчик, я вижу, что он пропускает последнюю итерацию цикла (я предполагаю, потому что len(fileList) теперь равен -=1 относительно его начальной len()) .
Следующий код «работает», но выглядит как хак: я добавляю файлы, которые хочу удалить из списка, во второй список, а затем повторяю его после факт. Я закомментировал исходную строку, что привело к «пропуску» итераций.

Код: Выделить всё

def print_numTXTs(fileList):
filesToRemoveFromList = []
counter = 0
for file in fileList:
if file.name[-4:] == ".txt":
counter +=1
if file.name == "a.txt":
#fileList.remove(file) #problem caused here
filesToRemoveFromList.append(file)
print(counter)
for file in filesToRemoveFromList:
fileList.remove(file)
print(len(fileList))
Этот код выводит количество всех файлов .txt, а длина списка на единицу меньше (поскольку элемент a.txt был удален) – это желаемое поведение .
Есть ли более элегантное решение этой проблемы?

Подробнее здесь: https://stackoverflow.com/questions/672 ... ipping-fut

Вернуться в «Python»