Поменять столбцы
Вы решили задачу. Теперь можно сравнить подходы.
В каждой строке меняем местами элементы с индексами i и j.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Обмен на месте
Множественное присваивание сначала вычисляет правую часть, поэтому ни одно значение не теряется.
def swap_columns(a, i, j):
for row in a:
row[i], row[j] = row[j], row[i]
n, m = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
i, j = map(int, input().split())
swap_columns(a, i, j)
for row in a:
print(*row)
Время: O(nm), включая чтение и вывод; обмен O(n). Память: O(nm) для массива; обмен O(1) дополнительно.
Другой способ: Перестроение строк по перестановке индексов
Сначала строим перестановку номеров столбцов, затем применяем её ко всем строкам. Это обобщается на произвольный порядок столбцов.
def swap_columns(a, i, j):
order = list(range(len(a[0])))
order[i], order[j] = order[j], order[i]
for r in range(len(a)):
a[r] = [a[r][c] for c in order]
n, m = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
i, j = map(int, input().split())
swap_columns(a, i, j)
for row in a:
print(*row)
Время: O(nm). Память: O(nm) для массива и O(m) дополнительной памяти.
На что обратить внимание
- Функция должна менять массив, а не только локальные переменные.
- При i=j массив остаётся прежним.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.