我试图找出矩阵中对角线元素的总和.这里,n是方阵的大小,a是矩阵.有人可以向我解释这里发生了什么.
n = 3
a = [[11,2,4],[4,5,6],[10,8,-12]]
sum_first_diagonal = sum(a[i][i] for i in range(n))
sum_second_diagonal = sum(a[n-i-1][n-i-1] for i in range(n))
print(str(sum_first_diagonal)+" "+str(sum_first_diagonal))
Run Code Online (Sandbox Code Playgroud) 二维列表如下:
1 | 2 | 3
- - - - -
4 | 5 | 6
- - - - -
7 | 8 | 9
Run Code Online (Sandbox Code Playgroud)
或者在纯粹的哈克尔
[ [1,2,3], [4,5,6], [7,8,9] ]
Run Code Online (Sandbox Code Playgroud)
预期的输出diagonals [ [1,2,3], [4,5,6], [7,8,9] ]是
[ [1], [4, 2], [7, 5, 3], [8, 6], [9] ]
Run Code Online (Sandbox Code Playgroud)
写作allDiagonals(包括反对角线)是微不足道的:
allDiagonals :: [[a]] -> [[a]]
allDiagonals xss = (diagonals xss) ++ (diagonals (rotate90 xss))
Run Code Online (Sandbox Code Playgroud)
类似的问题在StackOverflow
Hoogle
搜索给[[a]] -> …
我正在尝试使用2D ruby数组时遇到一些问题,当我进行数组切片时,我的LOC减少了很多.所以,例如,
require "test/unit"
class LibraryTest < Test::Unit::TestCase
def test_box
array = [[1,2,3,4],[3,4,5,6], [5,6,7,8], [2,3,4,5]]
puts array[1][2..3] # 5, 6
puts array[1..2][1] # 5, 6, 7, 8
end
end
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法获得对角切片?让我们说我想从[0,0]开始并想要一个3的对角切片.然后我会得到[0,0],[1,1],[2,2]的元素,我会得到一个类似的数组[1,4,7]例如上面.是否有任何神奇的单行红宝石代码可以实现这一目标?3次做{某些神奇的东西?}
这是我的第一篇文章,我是一个非常新的这个很棒的网站.
我想在对角线上列出3x3阵列中的所有元素:
L = [ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
Run Code Online (Sandbox Code Playgroud)
预期产量:
[[7], [4, 8], [1, 5, 9], [2, 6], [3]]
Run Code Online (Sandbox Code Playgroud)
另外,我如何将它推广到任何N x N阵列?
编辑:我注意到之前已经问过这个问题但是我正在寻找一种方法,而不需要导入numpy或任何库.
编辑2:我的一个同学提供了这个解决方案,我最喜欢它:
由于您从左下角开始查找对角线,您可以通过从方块的右上角开始并最终反转解决方案来完成此操作.我的方法是首先反转L中的每一行,然后将每个元素附加到其对应的对角线列表中.这里的见解是你开始在每一行K中追加元素,而不是在最终列表的第一个子列表中,但是从indice K开始.例如在将行[4,5,6]反转到行[6,5之后4],我会将6添加到我的对角排序列表的第二个子列表中(因为这是第2行),然后我将5添加到第3个子列表,然后我将4添加到第4个子列表.但是,如果我在对角线列表中没有第四个子列表,我会添加第四个空列表,然后用4填充它.
我的解释可能不太清楚,所以这里是我的代码.
def diagonal(l):
L = l[:]
return_list = [[] for i in range(len(L))]
for line in range(len(L)):
L[line].reverse()
i = line
for elem in L[line]:
if i >= len(return_list):
return_list.append([])
return_list[i].append(elem)
i += 1
return_list.reverse()
return return_list
Run Code Online (Sandbox Code Playgroud) 最初的问题:对于给定的3x3 tic tac toe board,检查其中一个玩家是否赢了.
到目前为止,我提出的最简单的解决方案是旋转矩阵并总结每一行:
board
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
pr(board)
0 1 2
3 4 5
6 7 8
pr(zip(*board))
0 3 6
1 4 7
2 5 8
Run Code Online (Sandbox Code Playgroud)
0..9以上数字仅用于显示棋盘上的位置,通常他们将为球员1填充1,为球员2填充-1,为未填充位置填充0.逐行进行,如果总和达到3或-3,则这是获胜区块.
但是,不检查对角线.有没有办法以优雅+高效的方式从这样的矩阵中提取对角线?我并不是指"手动"(0,1,2)使用普通索引,而是获得nxn矩阵的对角线.
PS pr只是打印2d列表的辅助函数:
def pr(x):
for row in x:
print ' '.join(map(str, row))
Run Code Online (Sandbox Code Playgroud)