Ваше решение технически верное, но есть два недостатка, особенно при работе с большими массивами и/или частыми операциями.
Во-первых, вы создаете копию массива для итерации (arr[::-1]), что занимает столько же памяти, сколько оригинальный массив.
Во-вторых, вы удаляете элементы из массива по значению (remove), а не по индексу (del), что замедляет выполнение.
Рекомендую ознакомиться с тем, как массив устроен внутри и понять временную сложность операций добавления, вставки, изменения и удаления элементов. Это поможет понять, почему одновременная итерация в прямом порядке с помощью цикла for и удаление элементов из массива - плохая идея.
Ниже представлены 4 функции с бенчмарками, включая вашу:
import random
import time
def func(arr, el):
for i in arr[::-1]:
if i == el:
arr.remove(el)
return len(arr)
def remove_reverse(arr, el):
for i in reversed(arr):
if i == el:
arr.remove(el)
return len(arr)
def del_by_index_reverse(arr, el):
for i in reversed(range(len(arr))):
if arr[i] == el:
del arr[i]
return len(arr)
def del_by_index_while(arr, el):
i = 0
while i < len(arr):
if arr[i] == el:
del arr[i]
else:
i += 1
return len(arr)
arr1 = [random.randint(0, 9) for num in range(100_000)]
arr2 = arr1[:]
arr3 = arr1[:]
arr4 = arr1[:]
el = 5
start = time.perf_counter()
print(func(arr1, el))
print(time.perf_counter() - start)
start = time.perf_counter()
print(remove_reverse(arr2, el))
print(time.perf_counter() - start)
start = time.perf_counter()
print(del_by_index_reverse(arr3, el))
print(time.perf_counter() - start)
start = time.perf_counter()
print(del_by_index_while(arr4, el))
print(time.perf_counter() - start)