如何在Python中自动创建字典

时间:2016-07-24 21:50:47

标签: 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:

接下来,我将为每个人创建一个字典,但我希望每个字典都能由列表项命名。例如,字典将是r1c1 = {'row':'1','Column':1}。

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

2 个答案:

答案 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},
    # ...
}

但您也可以解析该字符串并在rc之后提取数字以再次生成行号和列号。

事实上,我曾用同样的原则写过一个数独检查器;在以下代码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},
 ....
}