2013-02-28 1 views
-1

SuDuko Generator를 만들고 모든 1 개의 상자에 1을 배포하려고합니다. 이렇게하기 위해 두 개의 항목 (좌표 조정) 목록을 만들었습니다. 함수가 실행 된 후 [a, 1]과 같은 목록을 반환합니다. 그런 다음 에 1 (a1) 변수를 할당하는 빠른 방법을 원합니다. [a, 1]이 반환되고 1이 반환되는 경우 원하는 변수가됩니다. 내 1을 배포하려고하기 때문에). 이것을 할 수있는 방법이 있습니까? 그렇다면 어떻게? 여기에 소스 코드 : 사전에SuDoku에서 숫자 배포

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 

덕분에

+2

당신의 질문은 무엇입니까? – Blender

+1

함수가 반환하는 것에 따라'1' 또는'c3'에'a1'을 대입하는 방법은 미안합니다. @Blender –

+1

함수는'random1'을'[[ a, 1]''a1'을'1'에 할당하는 빠른 방법을 원합니다. –

답변

0
그때 빠른 방법은 변수가 내가 원하는 것이 될 것이다 (1) (A1에 A1 변수를 할당 할

경우 [A 1] 내가 1을 배포하려고하기 때문에 1이 반환되었습니다.). 이것을 할 수있는 방법이 있습니까?

예, 할 수있는 방법이 있지만 아니요, 원하지 않습니다. 올바른 작업은 다음과 같습니다.

81 개의 변수를 만드는 대신 인덱싱 할 수있는 하나의 데이터 구조를 만듭니다.

(행, 열) 쌍을 키로 사용하는 가장 확실한 선택은 dict입니다.

첫째,의 dict :

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

여기 단점은 당신이 그들을 채울 때까지 세포가 존재하지 않는다는 것입니다이처럼 그들을 미리 채울 수 있습니다.

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

을 또는 defaultdict을 사용하거나 [] 대신 setdefault 함수를 사용할 수 있습니다.

또한 등 list list의의, 또는 numpy.array처럼 명시 적 2D 객체의 어떤 종류를 사용할 수 있지만 다음 배열 좌표의 쌍으로 문자와 숫자를 변환하는 몇 가지 방법이 필요합니다

:

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 
+0

@Lewis 먼저 파이썬 튜토리얼을 먼저 읽어야한다. – XORcist