如何以最基础的方式查找网格中的所有对角线(不使用Numpy、Itertools及复杂内置函数)
实现网格中所有右上到左下对角线的基础Python方案
我明白你想要找出网格中所有右上到左下方向的对角线,而且希望用最基础的Python代码完成,不依赖任何额外库。你的当前代码只提取了其中一条对角线的元素,接下来我会帮你实现完整的逻辑。
核心思路
这类对角线的核心特征是:每个对角线上的元素,其行索引与列索引的差值是固定值(我们称这个差值为d)。对于m行n列的网格,d的取值范围是从m-1(最大行索引)到-(n-1)(最小的负列索引差值)。我们可以分两部分遍历这些d值,收集每个差值对应的所有元素:
- 从
d = m-1递减到0:处理从左下角开始、向右上方延伸的对角线 - 从
d = -1递减到-(n-1):处理从主对角线右侧开始、向右上方延伸的短对角线
完整代码
def get_all_diagonals(grid): # 处理空网格的边界情况 if not grid: return [] m = len(grid) # 网格的行数 n = len(grid[0]) # 网格的列数 diagonals = [] # 第一部分:处理d从m-1到0的对角线(左下到右上,长度从1到最大) for d in range(m-1, -1, -1): current_diagonal = [] row = d col = 0 # 遍历当前对角线的所有元素,行和列同步递增 while row < m and col < n: current_diagonal.append(grid[row][col]) row += 1 col += 1 # 将当前对角线的元素拼接成字符串加入结果 diagonals.append(''.join(current_diagonal)) # 第二部分:处理d从-1到-(n-1)的对角线(主对角线右侧,长度从最大-1到1) for d in range(-1, -(n), -1): current_diagonal = [] row = 0 col = -d # d是负数,-d对应起始列索引 # 遍历当前对角线的所有元素,行和列同步递增 while row < m and col < n: current_diagonal.append(grid[row][col]) row += 1 col += 1 diagonals.append(''.join(current_diagonal)) return diagonals # 测试用网格 test = [ ["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"], ["u","w","x","v","i","t"] ] # 输出结果 print(get_all_diagonals(test))
输出结果
运行上述代码后,你会得到:
['u', 'uw', 'twx', 'prxv', 'xqsvi', 'rabbit', 'ayeot', 'wzig', 'bce', 'ih', 't']
这完全匹配你期望的输出格式(每个元素对应一条对角线的字符串形式)。
你的原有代码问题说明
你之前的代码只提取了d=-1这条对角线的元素(行索引-列索引=-1,即行=列-1),所以只能得到['a', 'y', 'e', 'o', 't']。而上面的代码通过遍历所有可能的差值d,收集了所有对角线的元素,实现了完整需求。
内容的提问来源于stack exchange,提问作者Dave Shah
相关产品推荐
相关产品推荐

