-1

我正在创建一个 SuDuko 生成器,并试图将我的 1 分发到每个盒子。为此,我创建了一个包含两个项目的列表(充当坐标)。函数运行后,它会返回一个列表,例如[a, 1]. 然后我想要一种快速的方法来分配一个变量a11如果返回a1我想要的变量,因为我正在尝试分配我的 1)。有没有办法做到这一点?如果有怎么办?这是源代码:[a, 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

提前致谢

4

1 回答 1

0

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

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

与其创建 81 个不同的变量,不如创建一个可以索引的数据结构。

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

首先,对于一个dict

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

这里的缺点是单元格在您填充它们之前不存在。您可以像这样预先填充它们:

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

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

您也可以使用某种明确的 2D 对象,例如 a listof lists 或 anumpy.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

现在你可以这样做:

board = Board()
board.setcell('a', '1') = 1
于 2013-02-28T21:05:34.287 回答