Python 如何创建一个生成器生成器来检测Tic Tac Toe中的获胜列?

Python 如何创建一个生成器生成器来检测Tic Tac Toe中的获胜列?,python,generator,list-comprehension,tic-tac-toe,Python,Generator,List Comprehension,Tic Tac Toe,作为我正在学习的Python MOOC的一部分,我想更好地理解generator的使用 这里有一个tic-tac-toe的练习,我想用generator检查一个获胜的棋盘 为了检测获胜的列我创建了3个不同的生成器, 是否有创建生成器的选项来创建所有3个生成器对象 board = [['x', '.', '.'], ['.', 'o', '.'], ['x', '.', '.']] player_mark = 'x' col1_winner = all(mark== player_mark fo

作为我正在学习的Python MOOC的一部分,我想更好地理解
generator
的使用

这里有一个tic-tac-toe的练习,我想用generator检查一个获胜的棋盘

为了检测获胜的我创建了3个不同的生成器, 是否有创建生成器的选项来创建所有3个生成器对象

board = [['x', '.', '.'], ['.', 'o', '.'], ['x', '.', '.']]

player_mark = 'x'
col1_winner = all(mark== player_mark for (mark, _, _) in board)
col2_winner = all(mark== player_mark for (_, mark, _) in board)
col3_winner = all(mark== player_mark for (_, _, mark) in board)

为了在行中检测到胜利,我写了以下内容:

any(mark1 == mark2 == mark3 == player_mark for (mark1, mark2 , mark3) in board)
对创建生成器的一般情况很有帮助,但还不够。

您可以使用
zip(*board)
获取列的迭代器。例如:

board = [['x', '.', 'x'], ['x', 'o', '.'], ['x', '.', '.']]

player_mark = 'x'
col_win = any(all(mark == player_mark for mark in col) for col in zip(*board) )
col_win 
#True
这样就可以很好地与行对称:

row_win = any(all(mark == player_mark for mark in row) for row in board )

如果使用numpy数组,则可以很容易地使用np.sum查找行、列和,使用np.trace查找对角线

import numpy as np
x=np.array([[1,0,-1],[0,1,-1],[-1,0,1]])
-->array([[ 1,  0, -1],
          [ 0,  1, -1],
          [-1,  0,  1]])

np.sum(x,axis=1)
-->array([0, 0, 0])

np.sum(x,axis=0)
-->array([ 0,  1, -1])

np.trace(x)
-->3

np.trace(np.fliplr(x))
-->-1

很好,我在摸索这个