Python

Помогите, пожалуйста с делителями python

При вводе данного кода:

for i in range(245690, 245756):
cnt = 0
list1 = []
for j in range(1, i+1):
if i % j == 0:
cnt += 1
list1.append(j)
if cnt == 2:
print(list1)

выводит только 2 делитель, а первый остается единицей. Как это можно исправить?
Вот так это делается хоть немного по уму:
 from math import isqrt
start, end = 245690, 245756
for k, i in enumerate(range(start|1, end, 2), 1):
composite = False
for j in range(3, isqrt(i) + 1, 2):
if i % j == 0:
composite = True
break
if not composite:
print(k * 2 - (start & 1), i)
1) Список делителей не нужен. Тебе надо всего-то проверить, есть ли хоть один делитель, кроме единицы и самого числа. Иными словами, речь - о поиске простых чисел.
2) Проверять чётные числа не нужно, и так понятно, что они составные и потому не подходят. Поэтому внешний цикл - от ближайшего нечётного числа и с шагом 2.
3) Делить на 1 не нужно, и так ясно, что все числа делятся на 1. Поэтому внутренний цикл начинается не с 1 и не с 2, а сразу с 3.
4) Проверять чётные делители не нужно, и так понятно, что нечётное число на них не делится. Поэтому внутренний цикл - с шагом 2.
5) Проверять делители, превышающие √i, не нужно. Если такой делитель j найдётся, то i/j < √i - тоже делитель, который при переборе найдётся раньше.
6) Как только нашли первый нетривиальный делитель, нет смыла проверять остальные, внутренний цикл останавливаем.

Пункты (2), (3) и (4) снижают количество итераций в 4 раза. Пункт (5) - в сотни раз (на шестизначных числах). Пункт (6) - ещё в сотни раз, т.к. подавляющее большинство чисел - составные, и для них внутренний цикл завершится намного раньше.
И это - только при первом поверхностном взгляде на алгоритм.

А нумерацию для нас делает функция enumerate. Можно, конечно, и переменную-счётчик завести и вручную её инкрементировать, но есть же готовая функция...

Или ещё проще:
 from math import isqrt
start, end = 245690, 245756
for k, i in enumerate(range(start|1, end, 2), 1):
if all(map(i.__mod__, range(3, isqrt(i) + 1, 2))):
print(k * 2 - (start & 1), i)
Или так:
 from math import isqrt
start, end = 245690, 245756
for k, i in enumerate(range(start|1, end, 2), 1):
if all(i % j for j in range(3, isqrt(i) + 1, 2)):
print(k * 2 - (start & 1), i)
ББ
Бандит Бандитов
54 053
Лучший ответ
Чтобы выводить все делители числа включительно с 1, можно просто изменить условие `cnt == 2` на `cnt >= 2`:
 for i in range(245690, 245756):  
cnt = 0
list1 = []
for j in range(1, i+1):
if i % j == 0:
cnt += 1
list1.append(j)
if cnt >= 2:
print(list1)


Таким образом, в список `list1` будут добавляться все делли числа `i`, а условие `cnt >= 2` будет выводить только те числа, у которых 2 или более делителей.
Ма
Максим
9 136
Дим Димыч Захаров я не то имел ввиду. При вводе кода, у меня выводится такой ответ:
 [1, 245711] 
[1, 245719]
[1, 245723]
[1, 245741]
[1, 245747]
[1, 245753]
хотя должен быть следующим:

 22 245711 
30 245719
34 245723
52 245741
58 245747
64 245753
нужно сделать так, чтобы единицы заменились на первый делитель