一种从水平行列表中获取部分的简短方法,用于数独解谜器
a short(er) way of getting sections from a list of horizontal rows, for a sudoku puzzle solver
我目前有代码:
# gets all the horizontal rows from file
rows = [line.strip('\n') for line in open("F:/sudoku practice.txt",'r')]
# gets all the vertical columns from horizontal rows
columns = [(''.join(list(line[i]for line in rows)))for i in range(8)]
import itertools
sections = [[],[],[],[],[],[],[],[],[]]
for line in rows[:3]:
sections[0].append([(''.join(line[:3]))])
sections[1].append([(''.join(line[3:6]))])
sections[2].append([(''.join(line[6:9]))])
for line in rows[3:6]:
sections[3].append([(''.join(line[:3]))])
sections[4].append([(''.join(line[3:6]))])
sections[5].append([(''.join(line[6:9]))])
for line in rows[6:9]:
sections[6].append([(''.join(line[:3]))])
sections[7].append([(''.join(line[3:6]))])
sections[8].append([(''.join(line[6:9]))])
# flattening the list of lists of lists into a list
for i in range(9):
sections[i] = ''.join(list(itertools.chain.from_iterable(sections[i])))
print(sections)
这个returns:
[' 2 457689', '456 8 237', '789236 4 ', ' 5274396', '362 9 574', '9746538 ', ' 4 761938', '618 4 725', '397528 6 ']
其中列表中的每个项目代表数独谜题的一部分,这正是我想要的,但我希望有一种更短的方法来获取所有部分,我有一个用于获取行的衬垫和专栏,如果可能的话,想要类似的东西
由于在数独游戏中您需要大量访问子数组和对角线等,Numpy 将为您节省很多精力:
import numpy as np
a = np.random.randint(1, 9, (9,9))
print a
[[2 6 3 2 3 4 2 6 5]
[5 3 7 4 5 2 3 4 7]
[4 3 1 8 2 7 4 4 2]
[4 6 5 5 3 6 2 6 8]
[3 8 3 5 5 4 5 7 3]
[4 6 2 3 1 6 1 4 2]
[7 2 6 7 8 3 6 6 3]
[8 1 7 7 5 7 5 2 1]
[7 5 3 3 6 1 3 4 2]]
# middle section
print a[3:6,3:6]
[[5 3 6]
[5 5 4]
[3 1 6]]
# lower middle diagonals
print a[6:, 3:6].diagonal()
[7 5 1]
# lower middle upward diagonals
print a[6:, 3:6][::-1].diagonal()
[3 5 3]
我目前有代码:
# gets all the horizontal rows from file
rows = [line.strip('\n') for line in open("F:/sudoku practice.txt",'r')]
# gets all the vertical columns from horizontal rows
columns = [(''.join(list(line[i]for line in rows)))for i in range(8)]
import itertools
sections = [[],[],[],[],[],[],[],[],[]]
for line in rows[:3]:
sections[0].append([(''.join(line[:3]))])
sections[1].append([(''.join(line[3:6]))])
sections[2].append([(''.join(line[6:9]))])
for line in rows[3:6]:
sections[3].append([(''.join(line[:3]))])
sections[4].append([(''.join(line[3:6]))])
sections[5].append([(''.join(line[6:9]))])
for line in rows[6:9]:
sections[6].append([(''.join(line[:3]))])
sections[7].append([(''.join(line[3:6]))])
sections[8].append([(''.join(line[6:9]))])
# flattening the list of lists of lists into a list
for i in range(9):
sections[i] = ''.join(list(itertools.chain.from_iterable(sections[i])))
print(sections)
这个returns:
[' 2 457689', '456 8 237', '789236 4 ', ' 5274396', '362 9 574', '9746538 ', ' 4 761938', '618 4 725', '397528 6 ']
其中列表中的每个项目代表数独谜题的一部分,这正是我想要的,但我希望有一种更短的方法来获取所有部分,我有一个用于获取行的衬垫和专栏,如果可能的话,想要类似的东西
由于在数独游戏中您需要大量访问子数组和对角线等,Numpy 将为您节省很多精力:
import numpy as np
a = np.random.randint(1, 9, (9,9))
print a
[[2 6 3 2 3 4 2 6 5]
[5 3 7 4 5 2 3 4 7]
[4 3 1 8 2 7 4 4 2]
[4 6 5 5 3 6 2 6 8]
[3 8 3 5 5 4 5 7 3]
[4 6 2 3 1 6 1 4 2]
[7 2 6 7 8 3 6 6 3]
[8 1 7 7 5 7 5 2 1]
[7 5 3 3 6 1 3 4 2]]
# middle section
print a[3:6,3:6]
[[5 3 6]
[5 5 4]
[3 1 6]]
# lower middle diagonals
print a[6:, 3:6].diagonal()
[7 5 1]
# lower middle upward diagonals
print a[6:, 3:6][::-1].diagonal()
[3 5 3]