目前我有一个文件有6行数字,每行包含9个数字。关键是测试文件中的每一行数字是否完成了一个幻方。例如,假设文件中的一行数字是4 3 8 9 5 1 2 7 6。前三个数字必须是矩阵中的第一行。接下来的三个数字必须是第二行,第三行也是一样。 因此,您需要得到一个矩阵: [['4','3','8',['9','5','1',['2','7','6']]
我需要测试这个矩阵,看看它是否是一个有效的幻方(行加15,列加15,对角线加15)。在
我的代码当前为:
def readfile(fname):
"""Return a list of lines from the file"""
f = open(fname, 'r')
lines = f.read()
lines = lines.split()
f.close()
return lines
def assignValues(lines):
magicSquare = []
rows = 3
columns = 3
for row in range(rows):
magicSquare.append([0] * columns)
for row in range(len(magicSquare)):
for column in range(len(magicSquare[row])):
magicSquare[row][column] = lines[column]
return magicSquare
def main():
lines = readfile(input_fname)
matrix = assignValues(lines)
print(matrix)
每当我运行代码进行测试时,我都会得到:
^{pr2}$如你所见,我只把前3个数字输入矩阵。
最后,我的问题是,我如何继续我的矩阵与下面的6个数字行的数字?我不确定这是否是我能在我的循环中做的事情,或者我是否把我的线路划分错了,或者我完全走错了轨道?在
谢谢。在
要测试输入文件中的每一行是否包含幻方数据,需要稍微重新组织代码。我用了一种不同的技术来填充矩阵。理解
zip(*[iter(seq)] * size)
是如何工作的可能有点困难,但这是一个非常有用的模式。如果你需要解释,请告诉我。在我的代码对矩阵使用元组列表,而不是列表列表,但是元组在这里更适合,因为矩阵中的数据不需要修改。另外,我将输入数据从}是否是幻方。在
str
转换为int
,因为您需要对数字进行算术,以测试{这是
^{pr2}$make_square()
的一个修改版本,它返回一个列表列表而不是一个元组列表,但是请记住,如果您不需要列表提供的易变性,元组列表实际上比列表列表要好。在我想我应该提一下,实际上只有一个可能的3x3幻方,它使用从1到9的所有数字,不包括旋转和反射。但我想用暴力来证明这一点没有坏处。:)
另外,我有几年前写的Python代码(当我第一次学习Python时),它生成大小为nxn的奇数n>;=5的幻方。如果你想看就告诉我。在
zip和iterator对象
下面的代码简要说明了zip()和iter()函数的作用。在
下面是在交互式解释器中运行的相同代码,这样您就可以轻松地看到每个语句的输出。在
它只得到前3列,因为
因此
^{pr2}$注意,(3*row)+column每次迭代都会向右移动3列 每一次迭代,(9*line)+(3*row)+column将向右移动9列(整行)
一旦你得到了这个,你现在就可以开始寻找魔方了
相关问题 更多 >
编程相关推荐