Вопрос-Ответ

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 in list(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 if not check(x))

Если вам действительно нужно сделать это за один проход без копирования списка

i=0
while i < len(somelist):
element = somelist[i]
do_action(element)
if check(element):
del somelist[i]
else:
i+=1
2024-01-01 10:58 python list