数独中的数字分配

2024-09-21 14:10:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个SuDuko生成器,并试图将我的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

提前谢谢


Tags: randomremovechoiceletter1letter2number1number2rows2
1条回答
网友
1楼 · 发布于 2024-09-21 14:10:02

I then want a quick way to assign a variable a1 to 1 (a1 would be the variable I would want if [a, 1] was returned and 1 because I'm trying to distribute my 1's). Is there a way to do this?

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

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

最明显的选择是使用(行,列)对作为键的dict。你知道吗

首先,对于dict

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

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

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

或者可以使用defaultdict,或者使用setdefault函数代替[]。你知道吗

您也可以使用某种显式的2D对象,例如listlist,或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

现在你可以这样做:

board = Board()
board.setcell('a', '1') = 1

相关问题 更多 >

    热门问题