在SuDoku中分发号码

时间:2013-02-28 20:41:29

标签: python python-3.x sudoku

我正在创建一个SuDuko Generator,我正在尝试将我的1分发给每个盒子。为此,我创建了一个包含两个项目(表示坐标)的列表。函数运行后,它返回一个列表,如[a, 1]。然后,我想快速将变量a1分配给1a1将是我想要的变量[a, 1]1因为我我试图分发我的1。有没有办法做到这一点?如果是这样的话?这是源代码:

import random
def func():
    rows1 = ['a', 'b', 'c']
    rows2 = ['d', 'e', 'f']
    rows3 = ['g', 'h', 'i']
    columns1 = [1, 2, 3]
    columns2 = [4, 5, 6]
    columns3 = [7, 8, 9]
    letter1 = random.choice(rows1)
    number1 = random.choice(columns1)
    random1 = [letter1, number1]
    rows1.remove(letter1)
    columns1.remove(number1)
    letter2 = random.choice(rows1)
    number2 = random.choice(columns2)
    random2 = [letter2, number2]
    rows1.remove(letter2)
    columns2.remove(number2)
    letter3 = random.choice(rows1)
    number3 = random.choice(columns3)
    random3 = [letter3, number3]
    columns3.remove(number3)
    letter4 = random.choice(rows2)
    random4 = [letter4, number4]
    rows2.remove(letter4)
    columns1.remove(number4)
    letter5 = random.choice(rows2)
    number5 = random.choice(columns2)
    random5 = [letter5, number5]
    rows2.remove(letter5)
    columns2.remove(number5)
    letter6 = random.choice(rows2)
    number6 = random.choice(columns3)
    random6 = [letter6, number6]
    columns3.remove(number6)
    letter7 = random.choice(rows3)
    number7 = random.choice(columns1)
    random7 = [letter7, number7]
    rows3.remove(letter7)
    letter8 = random.choice(rows3)
    number8 = random.choice(columns2)
    random8 = [letter8, number8]
    rows3.remove(letter8)
    letter9 = random.choice(rows3)
    number9 = random.choice(columns3)
    random9 = [letter9, number9]
    return  (random1, random2, random3)    #etc

提前致谢

1 个答案:

答案 0 :(得分:0)

  

然后我想要一个快速的方法将变量a1分配给1(如果返回[a,1]则a1将是我想要的变量,而因为我正在尝试分配我的1,因此a1将是我想要的变量)。有没有办法做到这一点?

是的,有办法做到这一点,但不,你不想这样做。正确的做法是:

创建一个可以编制索引的数据结构,而不是创建81个不同的变量。

最明显的选择是使用(row,col)对作为键的dict

首先,对于dict

cells = {}
cells['a', '1'] = 1

这里的缺点是,在你填充它们之前,细胞不存在。你可以像这样预先填充它们:

cells = {(letter, digit): None for letter in 'abcdefghi' for digit in '123456789'}

或者您可以使用defaultdict,或使用setdefault功能代替[]

你也可以使用某种显式的2D对象,如list的{​​{1}}或list等,但是你需要一些方法来转换一个字母和数字成一对数组坐标:

numpy.array

你可能会意识到,这开始看起来很复杂,可能值得在课堂上结束。如果是这样,你是对的。像这样:

cells = [[None for _ in range(9)] for _ in range(9)]

def getcell(letter, digit):
    return cells[letter - ord('a')][int(digit) - 1]

def setcell(letter, digit, value):
    cells[letter - ord('a')][int(digit) - 1] = value

现在你可以这样做:

class Board(object):
    def __init__(self):
        self.cells = [[None for _ in range(9)] for _ in range(9)]
    def map_coords(self, letter, digit):
        return letter - ord('a'), int(digit) - 1
    def getcell(self, letter, digit):
        row, col = self.map_coords(letter, digit)
        return self.cells[row][col]
    def setcell(self, letter, digit, value):
        row, col = self.map_coords(letter, digit)
        self.cells[row][col] = value