如何在Python中自动创建字典
我正在尝试编写一个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: 接下来,我将为每个字典创建一个字典,但我希望每个字典都按列表项命名。例如,字典应
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非常陌生,还在学习如何使用它。