【问题标题】:Transposing a nxn Matrix in Python using only for/while loops仅使用 for/while 循环在 Python 中转置 nxn 矩阵
【发布时间】:2014-03-26 21:45:28
【问题描述】:

我想知道为什么我写的解决方案不起作用:

def transpose(sudoku):
    n = len(sudoku)
    l_tr = [0]*n
    k = 0
    tr_sudoku = [0]*n
    while k < n:
        tr_sudoku[k] = l_tr
        k = k+1  
    i = 0
    for i in range(len(sudoku)):
        j = 0
        for j in range(len(sudoku)):
            tr_sudoku[i][j] = sudoku[j][i]
            print j, i, tr_sudoku, sudoku[i][j]
        print tr_sudoku
return tr_sudoku

correct = [[1,2,3],[2,3,1],[3,1,2]]

print transpose(correct)

它输出以下错误解决方案:

0 0 [[1, 0, 0], [1, 0, 0], [1, 0, 0]] 1
1 0 [[1, 2, 0], [1, 2, 0], [1, 2, 0]] 2
2 0 [[1, 2, 3], [1, 2, 3], [1, 2, 3]] 3
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
0 1 [[2, 2, 3], [2, 2, 3], [2, 2, 3]] 2
1 1 [[2, 3, 3], [2, 3, 3], [2, 3, 3]] 3
2 1 [[2, 3, 1], [2, 3, 1], [2, 3, 1]] 1
[[2, 3, 1], [2, 3, 1], [2, 3, 1]]
0 2 [[3, 3, 1], [3, 3, 1], [3, 3, 1]] 3
1 2 [[3, 1, 1], [3, 1, 1], [3, 1, 1]] 1
2 2 [[3, 1, 2], [3, 1, 2], [3, 1, 2]] 2
[[3, 1, 2], [3, 1, 2], [3, 1, 2]]
[[3, 1, 2], [3, 1, 2], [3, 1, 2]]

我们将不胜感激!谢谢。

理想的正确解决方案:

correct = [[1,2,4],[2,3,4],[3,4,2]]

应该是:

tr_correct = [[1,2,3],[2,3,4],[4,4,2]]

【问题讨论】:

  • 什么(你认为)是正确的解决方案?
  • a whole big library for this kind of thing,除非你真的很喜欢自己动手。
  • 核心问题是您创建了新数组tr_sudoku,其中包含相同行l_tr n 次。

标签: python for-loop while-loop transpose matrix-transform


【解决方案1】:

您可以使用zip 轻松转置:

def transpose(sudoku):
    return list(map(list, zip(*sudoku)))

示例输出:

>>> correct = [[1,2,3],[2,3,1],[3,1,2]]
>>> transpose(correct)
[[1, 2, 3], [2, 3, 1], [3, 1, 2]]

最简单的“手动”方式是切换行列:

def transpose_manually(sudoku):
    output = sudoku[:] # new grid the same size
    for r in range(len(sudoku)): # each row
        for c in range(len(sudoku[0])): # each column
            output[c][r] = sudoku[r][c] # switch
    return output

【讨论】:

  • 呸,我差点写了这个……但是 仅使用 for/while 循环 说服了我不要这样做(无论如何+1,因为这是正确的做法,恕我直言)
  • 不是转置。
  • @user3286261 然后我建议您编辑您的问题以提供您所期望的输出,正如 thebjorn 建议的那样
  • 这给出了正确的解决方案。谢谢!乔恩,我确实想知道我的解决方案到底出了什么问题,因为它和你的 transpose_manually 做的事情一样。
  • @user3466256 哦,对不起,混淆了各种 user3xxxxxx!你的不起作用,因为tr_sudoku[k] = l_tr 表示所有行都引用同一个列表tr_sudoku[k] = l_tr[:] 会起作用,因为这每次都会创建列表的浅表副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
相关资源
最近更新 更多