如何在Python中自动创建字典

如何在Python中自动创建字典,python,dictionary,Python,Dictionary,我正在尝试编写一个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: 接下来,我将为每个字典创建一个字典,但我希望每个字典都按列表项命名。例如,字典应

我正在尝试编写一个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}


分离和存储这些信息的最佳方法是什么?

您不需要创建所有这些词典。您已经有了坐标,只是不要将它们锁定在字符串中:

boxes = []
for i in range(1, 10):
    for x in range(1,10):
        boxes.append((i, x))
将创建一个
(行、列)
元组列表,这样就不必将它们映射回去

即使需要将字符串与数据关联,也可以在嵌套字典中执行此操作:

coordinates = {
    'r1c1': {'row': 1, 'column': 1},
    # ...
}
但是您也可以解析该字符串并提取
r
c
之后的数字,以再次生成行号和列号

事实上,我曾经根据同样的原则写过一个数独棋盘;在下面的代码中,
block_index
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。

虽然Martijn的答案从“你应该做什么”的角度来看可能更好,但为了完整性,您可以使用以下方法轻松构建该结构:

以下带注释的代码将输出所需的数据结构:

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},
 ....
}

肯定有更好的解决办法。创建这些词典有什么意义?
box=box+['r'+str(i)+'c'+str(x)]
是一种有点昂贵的拼写
box.append('r'+str(i)+'c'+str(x))
甚至
box.append('r{}-c{}.fromat(i,c))
。创建这么多词典没有意义。您最好只在列表中存储
(i,c)
(元组)。这样,您根本不必映射回行、列格式,您已经拥有了坐标。不要使用字符串作为中介。谢谢。我对python非常陌生,还在学习如何使用它。