检查2d列表中的对角线(Python)

时间:2013-02-26 22:34:31

标签: python 2d

最初的问题:对于给定的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

0..9以上数字仅用于显示棋盘上的位置,通常他们将为球员1填充1,为球员2填充-1,为未填充位置填充0。逐行进行,如果总和达到3或-3,那么这就是获胜区块。

但是,未检查对角线。有没有办法以优雅+高效的方式从这样的矩阵中提取对角线?我并不是指“手动”(0,1,2)使用琐碎的索引,而是获得n x n矩阵的对角线。

P.S。 pr只是打印2d列表的辅助函数:

def pr(x):
    for row in x:
        print ' '.join(map(str, row))

5 个答案:

答案 0 :(得分:10)

你可以得到一个对角线:

[r[i] for i, r in enumerate(board)]
# [0, 4, 8]

和对面的对角线:

[r[-i-1] for i, r in enumerate(board)]
# [2, 4, 6]

答案 1 :(得分:3)

使用魔方为您的游戏区域编号

2|9|4
7|5|3
6|1|8

现在在三次移动后总结并检查总和是否为15 - >优胜者。你必须为每个玩家检查这个。当然,你必须在第4次移动和第5次移动(只有开始游戏的玩家)后重新检查

这就是我在第一个Java类中解决这个问题的方法。

答案 2 :(得分:2)

您可能需要的是numpy,请参阅Get all the diagonals in a matrix/list of lists in Python。也许你可以使用它,并像你那样翻转以获得其他解决方案。

if sum(board[i][i] for i in (0, 1, 2)) in (-3, 3):
    true

答案 3 :(得分:2)

方板上的对角线位于指数相等的位置,因此对于3x3板,它们是 board[0][0]board[1][1]board[2][2]或两者相加的电路板大小为1(本例中为3个):例如board[0][2]board[1][1]board[2][0] - 注意board[1][1]包含在两个集合中,应该是这样。这些事实使编写Python代码变得相当容易:

board = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
BOARD_SIZE = len(board)

diags1 = [board[i][i] for i in xrange(BOARD_SIZE)]
diags2 = [board[i][BOARD_SIZE-1-i] for i in xrange(BOARD_SIZE)]

print diags1
print diags2

输出:

[0, 4, 8]
[2, 4, 6]

答案 4 :(得分:0)

这将为您提供一个列表,其中包含一个方向的对角线元素(从左上角到右下角):

[board[i][i] for i in range(len(board))]

对于相反的方向,这将做同样的事情:

[board[i][len(board)-i-1] for i in range(len(board))]