В цикле странно работает срез списка

Решаю задачу из проекта Эйлера(3): Надо найти наибольший простой делитель

n = int(input())
list1 = list(range(2, n+1))
list2 = []
for i in list1:
    if i * i > n:
        break
    list2.append(list1[i::i])

print(list2)

Вывод: [[4, 6, 8, 10], [5, 8]] при n = 10

За алгоритм я беру "решето Эратосфена".

В первом списке из списка (Я думаю, что это позже поправлю и объединю списки в один) числа кратные двум, то есть каждое второе число после двойки, а уже следующие два списка это кратные трём и четырём, но отсчет идет не от i(3, 4) а с самого первого i(2). Почему [i::i] работает не так?

list2 должен содержать 4, 6, 8, 9 , 10


Ответы (1 шт):

Автор решения: RomanR

Вы используете i как индекс элемента в списке, но список то не с 0 начинается а с 2, поэтому индексы тоже нужно скорректировать на 2

list2.append(list1[i-2::i])

[[2, 4, 6, 8, 10], [3, 6, 9]]

Если не нужны начальные элементы, то добавить еще i:

list2.append(list1[i-2 + i::i])

[[4, 6, 8, 10], [6, 9]]

Можно заменить list2 на set и получить множество уникальных элементов:

n = int(input())
list1 = list(range(2,n+1))
print(list1)
set2 = set()
for i in list1:
    if i * i > n:
        break
    set2.update(list1[i-2+i::i])
print(set2)
→ Ссылка