Блок кода “Нахождение пифагоровых троек” лучше переписать так:
# Нахождение пифагоровых троек
for i in range(3, a): #начинаем с трёх
for j in range(i+1, a, 2): #начинаем с i+1, с шагом 2
if gcd(i, j) == 1: #проверяем, если не выполняется, нет смысла пробегать третий цикл
for g in range(j + j%2 + 1, a, 2): #если j четное, начинаем с j+1, если нечётное с j+2, шаг 2
if 1 == gcd(i, g) == gcd(g, j): #проверяем взаимную простоту гипотенузы и катетов
if i*i+j*j == g*g:
s1.append([i, j, g])
break #если нашли подходящую гипотенузу, прерываем третий цикл
А блок кода “Сортировка троек по возврастанию по последнему значению”, сделать так:
# Сортировка троек по возврастанию по последнему значению
s3 = sorted(s1, key=lambda x: x[2])
Если краткие пояснения к коду не понятны, могу пояснить.