我怎样才能使我的代码更简单并仍然获得相同的输出?

How can I make my code simpler and still get the same output?

所以我不得不写一个代码来找到网格中的所有对角线字符串mystery

mystery = [["r","a","w","b","i","t"],
           ["x","a","y","z","c","h"],
           ["p","q","b","e","i","e"],
           ["t","r","s","b","o","g"],
           ["u","w","x","v","i","t"],
           ["n","m","r","w","o","t"]]

在一些专家的帮助下,这是我目前所掌握的,因为我是新手。帮助我的专家是https://whosebug.com/users/5237560/alain-t

def diagsDownRight(M):
    diags,pad = [],[]
    while any(M):
        edge = [*next(zip(*reversed(M))),*M[0][1:]]
        M    = [r[1:] for r in M[1:]]
        diags.append(pad+edge+pad)
        pad.append("")
    return [*map("".join,zip(*diags))]

虽然这确实有效,但我自己觉得很难掌握,我不想只是写下我不理解的代码。那么,任何人都可以帮助使代码尽可能基本吗?

当我说尽可能基本时,我的意思是把你自己想象成一个刚学了几个月编码的人,请尽量简化我的代码。

这是一个更简单的版本:

def diagsDownRight(M):
    rows = len(M)      # number of rows
    cols = len(M[0])   # number of columns
    result   = []      # result will be a list of strings
    leftSide = [(r,0) for r in range(rows)]   # first column
    topSide  = [(0,c) for c in range(1,cols)] # first row
    for r,c in leftSide[::-1] + topSide:      # all start positions
        s = "" # string on the diagonal
        while r < rows and c < cols:
            s += M[r][c]  # accumulate characters
            r += 1        # move down
            c += 1        # and to the right
        result.append(s)  # add diagonal string to result
    return result

print(diagsDownRight(mystery))
['n', 'um', 'twr', 'prxw', 'xqsvo', 
 'rabbit', 'ayeot', 'wzig', 'bce', 'ih', 't']

它的工作方式是从左侧和顶部位置的坐标开始,向右和向下累积一个位置的字符,直到离开矩阵。

不过我还是建议您使用 Marat 的解决方案。它简单而优雅。我敢肯定,如果你打印 m 矩阵,你就会明白发生了什么

我能想到的最简单的方法:填充行,使对角线成为列。代码:

def diagsDownRight(M): 
    n = len(M)
    m = [[''] * (n-i-1) + row + [''] * i for i, row in enumerate(M)]  # pad rows 
    return [''.join(col) for col in zip(*m)] 

结果是一样的,IMO 方法更直观

考虑一个方阵

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

对角线的索引如下

d1 = [[0,0],[1,1],[2,2]]
d2 = [[0,1],[1,2]]
d3 = [[1,0],[2,1]]
d4 = [[2,0]]
d5 = [[0,2]]

要获得中间对角线,您可以简单地从索引开始

for i in range(3):
    index = [i,i]

对于下一个对角线,我们简单地做同样的事情...但是将 x 偏移 1,直到我们超出范围

for i in range(3):
   if i + 1 > 2:
      break
   index = [i, i+1]

对于下一个对角线,它是相同的...除了我们在另一个轴上进行

for i in range(3):
   if i + 1 > 2:
      break
   index = [i + 1, i]

对于最右端(在本例中...),它是相同的,但我们添加 2

 for i in range(3):
   if i + 2 > 2:
      break
   index = [i, i+2]

最底部相同,但使用另一个索引

 for i in range(3):
   if i + 2 > 2:
      break
   index = [i + 2, i]

我将留给您将其推断为可行的解决方案