Запутался в создании результирующей матрицы для транспонирования матрицы NxN в Python

Транспонирование матрицы NxN дает неправильные ответы при создании матрицы «результат» = входная матрица

Здесь начинающий программист. Я пытаюсь транспонировать матрицу NxN. Поместите код здесь, чтобы прояснить проблему:

def flippingMatrix(matrix):
    result=[[0 for i in range(len(matrix))] for j in range(len(matrix))]
    for i in result:
        print(i)
    
    for i in range(len(matrix)):
        for j in range(len(matrix)):
            result[j][i]=matrix[i][j]
    
    for i in result:
        print(i)
            

# //Main Program//
n = int(input().strip())

matrix = []

for i in range(n):
    matrix.append(list(map(int, input().rstrip().split())))

result = flippingMatrix(matrix)

Теперь, если мы запустим эту программу, мы введем «N», что означает «нет». строк и столбцов. А в следующей строке элементы в матрицу. Это ввод, который я дал:

2

1 2

3 4

Выход:

[0, 0]     //This is the result matrix that I made//
[0, 0]
[1, 3]     //The final result matrix//
[2, 4]

Переходя к проблеме: если я назначу

"result=matrix" 

вместо

result=[[0 for i in range(len(matrix))] for j in range(len(matrix))]

Я получаю неправильный ответ. Я предполагаю, что нам нужна результирующая матрица только как макет матрицы NxN. Тогда почему результат, аналогичный вводу, дает неверный ответ? Он в любом случае будет перезаписан.

С тем же вводом, что и раньше, я получаю следующий вывод:

[1, 2]     //Initial result matrix which is the copied input matrix//
[3, 4]
[1, 2]     //The final result matrix//
[2, 4]

Прошу прощения, если проблема немного неясна, я старался изо всех сил. Если кому-то нужны дополнительные объяснения, прокомментируйте этот пост, и я попытаюсь объяснить свою проблему.

Обновлено: Новый код, который я использую после того, как мне предложили отредактировать. Новый код выглядит следующим образом, и я столкнулся с той же проблемой

def flippingMatrix(matrix):
result=matrix
for i in result:
    print(i)

for i in range(len(matrix)):
    for j in range(len(matrix)):
        result[j][i]=matrix[i][j]

return result
        

# //Main Program//
n = int(input().strip())

matrix = []

for i in range(n):
    matrix.append(list(map(int, input().rstrip().split())))

result = flippingMatrix(matrix)
print(result)

Теперь проблема здесь может быть из-за оператора присваивания результат = матрица. Но я не думаю, что матрица результатов должна быть равна нулю, чтобы ее можно было переписать.

result = matrix не делает копию: в результате result и matrix становятся одним и тем же. Это проблема, потому что подумайте о случае, когда i=1, j=0. Тогда вы делаете result[0][1] = matrix[1][0]. Но какова ценность matrix[1][0] в этот момент? Это не исходное значение, это значение, которое вы присвоили result[1][0] на более ранней итерации цикла.
slothrop 22.05.2023 15:12

@slothrop Спасибо за понимание. Так вы говорите мне, что когда я пишу «результат = матрица», матрица и результат перепутаны? Если я поменяю одну из матриц, другая тоже изменится?

Flying_Zues 23.05.2023 12:11

Правильно, написание result = matrix просто означает, что result и matrix являются псевдонимами одного и того же объекта. См.: nedbatchelder.com/text/names.html

slothrop 23.05.2023 16:33

Привет @slothrop. Я все еще неясен. Как они могут запутаться? Если я изменю результат, как изменится матрица? Я в замешательстве по этому поводу. Я надеюсь, что вы можете помочь!!

Flying_Zues 25.05.2023 13:29

Дело не в том, что result и matrix — два запутанных объекта. Дело в том, что result и matrix — разные имена, относящиеся к одному и тому же объекту. Например, попробуйте print(id(result), id(matrix)), и вы увидите, что два идентификатора одинаковы.

slothrop 25.05.2023 13:46

Если вы хотите, чтобы result был новым объектом с данными, идентичными matrix, то вы можете сделать так: import copy, за которым следует result = copy.deepcopy(matrix).

slothrop 25.05.2023 13:49

См., например: stackoverflow.com/questions/2541865/…

slothrop 25.05.2023 14:06

Спасибо @slothrop за это объяснение и за ссылку на пост. Пост объяснили хорошо. Я думаю, что причина того, что result=matrix не работает, заключается в том, что это список внутри списка. Прочитал весь пост и теперь лучше понял. Еще раз спасибо. Я не знаю, как пометить ваш комментарий как ответ, но ваш, безусловно, есть!

Flying_Zues 26.05.2023 12:30

Прохладный! Я думаю, что ответы на связанный вопрос уже достаточно хорошо его охватывают. Кстати, если вам нужен краткий способ транспонирования 2D-массива, вы можете сделать result = list(zip(*matrix)). Но полезно пройти через процесс, который у вас есть, потому что вы узнаете больше о задействованных структурах.

slothrop 26.05.2023 12:40

Еще раз спасибо за это понимание! Конечно, я узнаю много нового, загрузив сюда один вопрос. Еще раз спасибо!

Flying_Zues 27.05.2023 13:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
10
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваша функция должна иметь возврат, если вы назначите matrix=result внутри ее области, это не будет распространяться за пределы функции, это только назначение ссылки/указателя. Значения каждой матрицы не копируются.

Пытаться:

def flippingMatrix(matrix):
    result=[[0 for i in range(len(matrix))] for j in range(len(matrix))]
    for i in range(len(matrix)):
        for j in range(len(matrix)):
            result[j][i]=matrix[i][j]
    return result
            

# //Main Program//
n = int(input().strip())

matrix = []

for i in range(n):
    matrix.append(list(map(int, input().rstrip().split())))

print(matrix)
result = flippingMatrix(matrix)
print( result)

Протестировано здесь для n = 3:

def flippingMatrix(matrix):
    result=[[0 for i in range(len(matrix))] for j in range(len(matrix))]
    for i in range(len(matrix)):
        for j in range(len(matrix)):
            result[j][i] = matrix[i][j]
    return result
            

# //Main Program//
n = 3
matrix = [[i+j*n for i in range(n)] for j in range(3)]
print( matrix) # returns [[0, 1, 2], [3, 4, 5], [6, 7, 8]]

matrix = flippingMatrix(matrix)
print( matrix) # returns [[0, 3, 6], [1, 4, 7], [2, 5, 8]]

Здравствуйте, спасибо за это исправление. Я применю это в моей следующей программе. Однако проблема все еще сохраняется, и возврат переменной не решает эту проблему.

Flying_Zues 23.05.2023 12:12

Пожалуйста, поделитесь своим кодом, я только что снова протестировал свой код для матриц линейного размера = 2 и 3, и, похоже, он работает, см. Мое редактирование

Learning is a mess 23.05.2023 12:18

Привет. извините за поздний ответ и спасибо за использование кода самостоятельно. Я отредактировал свой пост с обновленным кодом, но, похоже, столкнулся с той же проблемой. Я надеюсь, что вы можете помочь. Еще раз спасибо``

Flying_Zues 25.05.2023 13:27
Ответ принят как подходящий

Итак, я узнал, разговаривая в комментариях с @slothrop, Python не воспринимает копирование списков внутри списков легкомысленно. Чтобы сделать копию, я должен использовать разные команды, например, чтобы он фактически создавал независимый 2D-массив:

b = copy.deepcopy(a)
b = [item[:] for item in a]
b = [item.copy() for item in a]
b = [list(item) for item in a]
b = [copy.copy(item) for item in a]
b = []; b.extens[a]

Ссылка на такой другой вопрос здесь.

Похоже, b = []; b.extend[a] — это ошибка в ответе на другой вопрос. Это то же самое, что делать b = [item for item in a] вместо b = [item[:] for item in a]. Все остальные вещи, которые вы предлагаете, отлично подойдут для 2D-массива.

slothrop 26.05.2023 12:43

Другие вопросы по теме