В цикле странно работает срез списка
Решаю задачу из проекта Эйлера(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 шт):
Вы используете 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)