我正在创建一个SuDuko Generator,我正在尝试将我的1分发给每个盒子。为此,我创建了一个包含两个项目(表示坐标)的列表。函数运行后,它返回一个列表,如[a, 1]
。然后,我想快速将变量a1
分配给1
(a1
将是我想要的变量[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
提前致谢
答案 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