我怎样才能使我的代码更简单并仍然获得相同的输出?
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]
我将留给您将其推断为可行的解决方案
所以我不得不写一个代码来找到网格中的所有对角线字符串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]
我将留给您将其推断为可行的解决方案