我有一个数据文件,包括未知棋盘游戏的“快照”,例如tictactoe / dama / chess / go..etc。 但我不知道游戏的参数,例如棋盘尺寸,棋子类型......等等
最简单的案例是tictactoe,所以我们以此为例。 片段和空字段表示为数字(-n,-n + 1 .. 0,+ n-1 .. + n ..)
开始:
在这个简单的情况下,每次移动(x,O由1或-1表示,空字段为0)。最后,我将有一组由两条空行隔开的3x3矩阵。
如何将数据读入ndim数组([length_of_game] [board_width] [board_length] ,而无需手动添加任何有关bor / length大小的信息 游戏?
我只知道我有一个尺寸未知的棋盘,不同的棋子用不同的数字表示,快照代表游戏的演变。
答案 0 :(得分:1)
您可以这样做的一种方法是逐行解析文件。用空格分割线(假设一行中的数字用空格分隔)并将结果列表添加到另一个列表中(让我们称之为current_game),它将保存所有行(行数据)。遇到空行时,可以将current_game列表添加到另一个列表中(让我们称之为游戏),这将保留所有游戏。
以下是一个示例函数:
def parse_data_file(file_path):
games = []
current_game = []
with open(file_path, mode='r',) as file_reader:
for line in file_reader:
if len(line.strip()) == 0:
if len(current_game) > 0:
# A empty new line, so the current game has finished. Add the current game to the games.
games.append(current_game)
current_game = []
else:
current_game.append(line.strip().split())
return games
该函数检查当前行长度是否大于0,如果是,则首先对其进行条带化处理(从行尾除去任何空格),然后用空格分割它。您可以阅读有关拆分函数here的更多信息。如果行长度等于0,并且current_game长度大于0(此检查是在游戏列表中仅添加一次current_game),它会将列表添加到游戏列表中,并将其设置为新的空列表。
如果要将列表中的字符串强制转换为整数,则可以在拆分行时使用map函数。以下是将字符串转换为整数的相同代码:
def parse_data_file(file_path):
games = []
current_game = []
with open(file_path, mode='r',) as file_reader:
for line in file_reader:
if len(line.strip()) == 0:
if len(current_game) > 0:
# A empty new line, so the current game has finished. Add the current game to the games.
games.append(current_game)
current_game = []
else:
current_game.append(map(lambda item: int(item), line.strip().split()))
return games
最后,要在numpy ndim数组中强制转换列表,可以使用numpy中的array函数。 这个解决方案假设在最后一个游戏之后,会有两个空行,但很容易改变它。