Решето Эратосфена предполагает удаление элементов, кратных очередному простому числу.
Т.е. обработали 2 - вычеркиваем каждый 2й элемент. Обработали 3 - каждый третий, и так далее.
Отсюда получаем следующее.
У нас есть исходный список элементов.
numbers = list(range(2, n+1))
На каждом шаге, когда мы проверяем число k, мы выкидываем все числа, кратные k, кроме самого k.
numbers = [ x for x in numbers if x % k != 0 or x == k]
А как мы выбираем k? Просто идём по списку чисел от начала. Все элементы в начале списка всегда будут простыми, так как 2 - простое, а все последующие составные элементы будут выкинуты на одной из итераций
i = 0
while i < len(numbers):
k = numbers[i]
numbers = [ x for x in numbers if x % k != 0 or x == k ]
i += 1