我正在尝试编写一个解决数独谜题的python代码。我的代码首先列出每个行/列组合或每个框的坐标。接下来,我想找到一种方法,为每个盒子引用它的位置。 这是我目前的代码:
boxes = []
for i in range(1, 10):
for x in range(1,10):
boxes = boxes + ['r'+str(i)+'c'+str(x)]
for box in boxes:
接下来,我将为每个人创建一个字典,但我希望每个字典都能由列表项命名。例如,字典将是r1c1 = {'row':'1','Column':1}。
分离和存储此信息的最佳方法是什么?
答案 0 :(得分:1)
您不需要创建所有这些词典。你已经有了坐标,只是不要把它们锁在字符串中:
boxes = []
for i in range(1, 10):
for x in range(1,10):
boxes.append((i, x))
会创建一个(row, column)
元组列表,然后您就不必将它们映射回来了。
即使您需要将字符串与数据相关联,也可以在嵌套字典中执行此操作:
coordinates = {
'r1c1': {'row': 1, 'column': 1},
# ...
}
但您也可以解析该字符串并在r
和c
之后提取数字以再次生成行号和列号。
事实上,我曾用同样的原则写过一个数独检查器;在以下代码block_indices
中,per9()
和zip(*per9(s))
为拼图的每个块,行或列生成索引,让您验证每个块中有9个唯一值。唯一的区别是,我使用一个长列表代替矩阵来表示拼图,所有元素从行到行包含在序列中:
from itertools import product
block_indices = [[x + y + s for s in (0, 1, 2, 9, 10, 11, 18, 19, 20)]
for x, y in product(range(0, 81, 27), range(0, 9, 3))]
def per9(iterable):
# group iterable in chunks of 9
return zip(*([iter(iterable)] * 9))
def is_valid_sudoku(s):
return (
# rows
all(len(set(r)) == 9 for r in per9(s)) and
# columns
all(len(set(c)) == 9 for c in zip(*per9(s))) and
# blocks
all(len(set(s[i] for i in ix)) == 9 for ix in block_indices)
)
因此第1行第4列是1 * 9 + 4 =平面列表中的索引13。
答案 1 :(得分:0)
虽然Martijn的答案可能更好地从“你应该做什么”的角度来看,但为了完整起见,你可以使用dictionary comprehension很容易地构建这个结构:
以下带注释的代码将输出您想要的数据结构:
boxes = {
"r%sc%s"%(i,j): # build the keys in the form "r1c2"
{'row':i,"column":j} # build the dictionary of values - {'row':1, 'column': 2}
for i in range(1,10) # first level of loop
for j in range(1,10) # second level of loop
}
print boxes
这将以您想要的格式输出:
{ 'r1c1': { 'column': 1, 'row': 1},
'r1c2': { 'column': 2, 'row': 1},
'r1c3': { 'column': 3, 'row': 1},
'r1c4': { 'column': 4, 'row': 1},
....
}