Пытался решить проект Эйлера, задача 4 на Python

В месте с ошибкой выдает "List index out of range", хотя через "else" должны проходить только шестизначные числа, а значит обращение к [5] должно нормально работать. Исправление [5] на [4] дает результат, следственно проблема в этом, но при такой замене теряется весь смысл.

def pal():
    for i in range (100, 1000):
        for x in range(100, 1000):
           nums =  [int(z) for z in str(x*i)]
           if x*i % 10000 < 10:
                if nums[0] == nums[3] and nums[1] == nums[4]:
                    pals.append(x*i)
           else:
#ошибка здесь
                if nums[0] == nums[5] and nums[1] == nums[4] and nums[2] == nums[3]:
                    pals.append(x*i)
pal()
print(pals)


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

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

Ошибка в индексации массива, довольно большое количество чисел будут пятизначными.

Ошибки можно избежать, если упростить код. Проверять на палиндром можно сравнением строки с её перевёрнутой копией. Также можно уменьшить количество итераций вложенного цикла, если начинать их с i.

Пример:

m = 0
for i in range(100, 1000):
    for j in range(i, 1000):
        x = str(i*j)
        if x == x[::-1] and int(x) > m:
            m = int(x)
print(m)

stdout:

906609
→ Ссылка
Автор решения: Zenitsa
lst = []

for i in range(100, 1000):
    for j in range(100, 1000):
    s = str(i * j)
    if s == s[::-1]:
        lst.append(int(s))
print(max(lst))
→ Ссылка
Автор решения: Stanislav Volodarskiy

Если написали "через "else" должны проходить только шестизначные числа", то надо отобразить это в коде. Вот так:

...
           else:
                assert len(nums) == 6
                if nums[0] == nums[5] and nums[1] == nums[4] and nums[2] == nums[3]:
...

А как assert упадет, искать ошибки - почему ваше предположение и реальность расходятся.

→ Ссылка