цикл for игнорирует некоторые элементы моего списка [duplicate]

1

Возможный дубликат:
Удаление элементов из списка во время итерации в Python

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

import datetime
import numpy as np
import os

list_dates = [datetime.date(2012,1,3), datetime.date(2012,1,1), datetime.date(2012,1,5), datetime.date(2013,1,3), datetime.date(2013,1,1)]

for item in list_dates:
    if item > datetime.date(2012,1,1):
        list_dates.remove(item)

print list_dates

возвращается

[datetime.date(2012, 1, 1), datetime.date(2013, 1, 3)]
  • 0
    Вероятно, потому, что вы изменяете список по мере его прохождения.
  • 2
    Вы не можете перебирать список и одновременно удалять из него элементы.
Показать ещё 4 комментария
Теги:
for-loop
loops

2 ответа

2
Лучший ответ

Джеймс и GWW правы, вы не можете изменить список, пока вы повторяете это. Вместо этого скопируйте элементы, которые вы хотите сохранить в новом списке.

list_dates = [datetime.date(2012,1,3), datetime.date(2012,1,1), datetime.date(2012,1,5), datetime.date(2013,1,3), datetime.date(2013,1,1)]        

for item in list_dates:
            if item < datetime.date(2012,1,1):
                new_list_dates.add(item); // move this item (which you want to keep) to a new list.

    print new_list_dates
  • 1
    Для этого вы также можете использовать понимание списка (если вы видите вопрос, который я пометил как дубликат)
0

Или измените это место так:

import datetime

list_dates = [datetime.date(2012,1,3), datetime.date(2012,1,1), datetime.date(2012,1,5), datetime.date(2013,1,3), datetime.date(2013,1,1)]

for i in range(len(list_dates) - 1, -1, -1):
    item = list_dates[i]
    if item > datetime.date(2012,1,1):
        del list_dates[i]

print list_dates

или

import datetime


list_dates = [datetime.date(2012,1,3), datetime.date(2012,1,1), datetime.date(2012,1,5), datetime.date(2013,1,3), datetime.date(2013,1,1)]

i = 0
while i < len(list_dates):
    item = list_dates[i]
    if item > datetime.date(2012,1,1):
        del list_dates[i]
    else:
        i += 1

print list_dates

Ещё вопросы

Сообщество Overcoder
Наверх
Меню