-1

私は数独ジェネレーターを作成していて、1をすべてのボックスに配布しようとしています。これを行うために、2つのアイテム(座標として機能)を含むリストを作成しました。関数が実行されると、などのリストが返され[a, 1]ます。a1次に、変数を割り当てる簡単な方法が必要です1(返された場合、および1を分散しようとしているためa1、必要な変数になります)。これを行う方法はありますか?もしそうなら、どのように?ソースコードは次のとおりです。[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に割り当てる簡単な方法が必要です(a1は、[a、1]が返された場合に必要な変数であり、1を分散しようとしているため1になります)。これを行う方法はありますか?

はい、これを行う方法はありますが、いいえ、あなたはしたくありません。行うべき正しいことはこれです:

81の異なる変数を作成する代わりに、インデックスを作成できる1つのデータ構造を作成します。

最も明白な選択は、dictキーとして(row、col)ペアを使用することです。

まず、dict

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

ここでの欠点は、セルを入力するまでセルが存在しないことです。次のようにセルを事前に入力できます。

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

または、を使用するdefaultdictか、のsetdefault代わりに関数を使用することができます[]

sやaなどlistの明示的な2Dオブジェクトを使用することもできますが、その場合は、文字と数字を配列座標のペアに変換する方法が必要になります。listnumpy.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 に答える