Ну добре, все одно відпишуся. Отже, оптимізуємо ваш код за моїми порадами:
out = []
from string import ascii_uppercase as alph
alph *= 2
n, k = map(int, input().split())
for _ in range(n): #i не потрібне
inp = input()
for x in inp:
if x in alph:
out.append(alph[alph.index(x) - k])
else:
out.append(x)
print(" ".join(out))
Оскільки тепер ми віднімаємо індекс, нам не потрібна подвоєна стрічка.
Крім того, в обох гілках всередині відбувається out.append, тобто їх можна об'єднати, а змінну inp, що використовується лише в одному місці, не створювати:
out = []
from string import ascii_uppercase as alph
n, k = map(int, input().split())
for _ in range(n):
for x in input():
out.append(alph[alph.index(x) - k] if x in alph else x)
print(" ".join(out))
Тепер додаємо трохи справжньої пітонячої магії. Конструкція for ...: ...append(...) настільки часто зустрічається, що для неї створено окрему конструкцію - генератор (а сама вона вважається антипатерном):
out = []
from string import ascii_uppercase as alph
n, k = map(int, input().split())
for _ in range(n):
r = [alph[alph.index(x) - k] if x in alph else x for x in input()]
out += r
print(" ".join(out))
Змінну r я залишив лише для того, щоб ви змогли побачити, як це відбувається; звісно, її можна (і треба!) прибрати.
Наступне питання - пробіли. Ви їх додаєте між кожним символом, а мають бути між фразами. Я спершу не привернув увагу до цього, це технічне, але давайте виправимо:
out = []
from string import ascii_uppercase as alph
n, k = map(int, input().split())
for _ in range(n):
out.append(''.join(alph[alph.index(x) - k] if x in alph else x for x in input()))
print(" ".join(out))
О, знову цей антипатерн for-append!
from string import ascii_uppercase as alph
n, k = map(int, input().split())
out = [''.join(alph[alph.index(x) - k] if x in alph else x for x in input()) for _ in range(n)]
print(" ".join(out))
out вже не потрібен:
from string import ascii_uppercase as alph
n, k = map(int, input().split())
print(" ".join(''.join(alph[alph.index(x) - k] if x in alph else x for x in input()) for _ in range(n)))
Що лишається? Перевірка in та index роблять, фактично, одне й те саме - пошук в циклі. Тобто у нас тут зайвий цикл всередині. Можна замість індексу брати код символу і перевіряти, чи x літера, функцією isalpha:
from string import ascii_uppercase as alph
n, k = map(int, input().split())
print(" ".join(''.join(alph[ord(x)-ord('A')-k] if x.isalpha() else x for x in input()) for _ in range(n)))
Олімпіадний спосіб - замінити ord('A') на код (65). Крім того, можна замість alph[...] робити перетворення коду в символ функцією chr, це робить /KIT\.
А можна створити словник для заміни літер:
from string import ascii_uppercase as alph
n, k = map(int, input().split())
from_letters = alph[k:]+alph[:k] #зсув alph на k літер
d = {f:t for f,t in zip(from_letters, alph)}
print(" ".join(''.join(d.get(x,x) for x in input()) for _ in range(n)))
Звісно, змінна from_letters не потрібна; cтворення словника можна перенести всередину print, скоротивши код, але тоді він перестворюватиметься на кожній ітерації, так що лишаємо як є:
from string import ascii_uppercase as alph
n, k = map(int, input().split())
d = {f:t for f,t in zip(alph[k:]+alph[:k], alph)}
print(" ".join(''.join(d.get(x,x) for x in input()) for _ in range(n)))
Але ситуація така, що оця конструкція (словник символів + ''.join(d.get(x,x) for x in input())) теж настільки популярна, що для неї існують окремі функції maketrans (створює словник) та translate (замінює символи). Так і виходить мій код.