Для такой вот работы идеально подходят связные списки. Там можно менять объект не портя никакие итераторы. Проблема только в том, что связные списки в питоне не реализованы на уровне языка. Поищите реализацию, наверняка есть удобный модуль со списками.
Еще можноиспользовать обычный list, только вы итерируйтесь циклом while и используйте индексы:
i = 0
while i < len(arr):
x = arr[i]
j = i+1
while j < len(arr):
if ShouldDelete(arr[j], arr[i]):
del a[j]
Это будет в n раз медленнее, к сожалению. Можно наверно слайсами сделать быстрее:
arr[i+1:] = y for y in arr[i+1:] if not ShouldDelete(x, arr[i])
Я не питонист и возможно ошибку допустил. И мне этот код не кажктся очень понятным, но возможно это истиный путь для питона.
А так, в общем случае, идет двойная итерация с пометками элементов на удаление.
Какого-то названия этот прием не имеет, ибо это костыль для конкретных реализаций контейнеров.