Python: Removing list element while iterating over list [duplicate]
Python: удаление элемента списка при выполнении итерации по списку [дубликат]
Я выполняю итерацию по списку элементов в Python, выполняю над ним некоторые действия, а затем удаляю их, если они соответствуют определенным критериям.
for element in somelist: do_action(element) if check(element): remove_element_from_list
Что мне следует использовать вместо remove_element? Я видел, как задавались подобные вопросы, но заметил наличие части do_action, которая должна выполняться для всех элементов и, таким образом, исключает решение с использованием фильтров.
Переведено автоматически
Ответ 1
Вы всегда можете выполнить итерацию по копии списка, оставляя за собой право изменять оригинал:
for item inlist(somelist): ... somelist.remove(item)
Ответ 2
Чтобы соответствовать этим критериям: изменять исходный список на месте, никаких копий списка, только один проход, работает, традиционным решением является выполнение итерации в обратном направлении:
for i in xrange(len(somelist) - 1, -1, -1): element = somelist[i] do_action(element) if check(element): del somelist[i]
Бонус: не выполняется len(somelist) на каждой итерации. Работает на любой версии Python (по крайней мере, начиная с 1.5.2) ... s/xrange/range/ для 3.X.
Обновление: если вы хотите выполнить итерацию вперед, это возможно, просто сложнее и уродливее:
i = 0 n = len(somelist) while i < n: element = somelist[i] do_action(element) if check(element): del somelist[i] n = n - 1 else: i = i + 1
Ответ 3
List comp:
results = [x for x in (do_action(element) for element in somelist) if check(element)]
Ответ 4
for element in somelist: do_action(element) somelist[:] = (x for x in somelist ifnot check(x))
Если вам действительно нужно сделать это за один проход без копирования списка
i=0 while i < len(somelist): element = somelist[i] do_action(element) if check(element): del somelist[i] else: i+=1