Всё решается гораздо проще:
n = int(input('Количество элементов: '))
r = range(n)
elems = list(dict.fromkeys(int(input('Введи элемент: ')) for _ in r))
imin = min(r, key = elems.__getitem__)
imax = max(r, key = elems.__getitem__)
elems[imin], elems[imax] = elems[imax], elems[imin]
print(*elems, sep = '\n')
Здесь 3 пробега по списку (не считая ввода), сложность алгоритма O(n log n).
У твоего же алгоритма сложность квадратичная и 4 пробега сверх того (min, max, index - каждый делает отдельный пробег).
Можно обойтись и двумя пробегами, чуть усложнив алгоритм:
from functools import reduce
n = int(input('Количество элементов: '))
elems = list(dict.fromkeys(int(input('Введи элемент: ')) for _ in range(n)))
kf = elems.__getitem__
imin, imax = reduce(lambda t, i: (min(t[0], i, key = kf), max(t[1], i, key = kf)), range(1, n), (0, 0))
elems[imin], elems[imax] = elems[imax], elems[imin]
print(*elems)
А можно и одним:
from functools import reduce
n = int(input('Количество элементов: '))
def minmaxd(tm, te):
imin, vmin, imax, vmax, d = tm
i, v = te
return (
i if vmin > v else imin,
v if vmin > v else vmin,
i if vmax < v else imax,
v if vmax < v else vmax,
d | { v: None }
)
es = (int(input('Введи элемент: ')) for _ in range(n))
first = next(es)
imin, _, imax, _, d = reduce(minmaxd, enumerate(es, 1), (0, first, 0, first, { first: None }))
elems = list(d)
elems[imin], elems[imax] = elems[imax], elems[imin]
print(*elems)
Использование вводимых чисел в качестве ключей словаря обеспечивает уникальность и сохраняет порядок ввода (Питон 3.7+ это гарантирует); а уже после отсева дубликатов переводим ключи в список.
Дальше находим индексы минимального и максимального элементов и меняем эти элементы местами. В последнем алгоритме поиск минимума и максимума делается в той же итерации, где ввод.