2012-04-13 2 views
2

저는 Udacity를 사용하여 약 한 달 동안 프로그래밍과 Python을 배웠습니다. 스도쿠리스트가 전달되었는지를 검사하는 함수를 작성해야하는 질문들 중 하나를 위해서. 아래 for 루프에서 오타를 만들었으므로 파이썬 함수가 여전히 작동합니다. 왜?

, 나는 zip()를 사용하여 원본과 전치 목록 모두 동시에 rowcol을 반복하고 싶었지만 실수로 내 or 문 하반기에 row에 남아. 나는 그것을 도망 갔고 놀랍게도 여전히 정확한 답을 되찾았다.

def check_sudoku(array): 
    is_sudoku = True 
    reference = range(1, len(array) + 1) 
    transposed = zip(array) 

    for row, col in zip(array, transposed): 
     if sorted(row) != reference or sorted(row) != reference: 
      is_sudoku = False 
      break 
    return is_sudoku 

내 생각 엔 내가 기본적으로 is_sudoku = True을 정의하기 때문에 그것의, 그리고 내 트랜스가 작동하지 않은 경우에도이 잘못된 값을 잡는다 그래서 나는 참조 목록 rows을 비교하고있다. 내가 두 번째 rowcol으로 바꿨을 때, 그것은 망가졌습니다.

내 질문은 내 생각에 맞습니까? 그렇지 않은 경우이 코드가 작동하는 이유는 무엇이며 어떻게 작성할 수 있습니까?

감사합니다. (내가 전달한 목록을 보려는 경우 코드 패드에 붙여 넣음 - http://codepad.org/IXDlZuUu)

+0

나는 그것이 작동하게하려면'zip (array)'을'zip (* array) '으로 바꿔야한다고 생각합니다. – phant0m

+0

nvm, 분명히 py3k에만 관련이 있습니다 – phant0m

답변

0

올바른 값이 거짓이면 어떤 점에서는 sorted(row) != reference이기 때문에 함수가 작동합니다. 다시 작성에 관해서는, 나는 이런 식으로 뭔가 더 명확 것 같아 : 당신이 transposed = zip(array) 다음 zip(array, transposed)을 왜 나를 볼 수 있도록

def check_sudoku(array): 
    reference = range(1, len(array) + 1) 
    transposed = zip(array) 
    for row, col in zip(array, transposed): 
     if sorted(row) != reference or sorted(row) != reference: 
      return False 
    return True 

또한, 꽤 어렵다. 지금까지 내가 말할 수있는 것은 [1, 2, 3]과 같은 목록을 받아서 [(1, (1,)), (2, (2,)), (3, (3,))]으로 바꾼다.

행과 열을 반복하려는 경우 작동하는 한 가지 방법이 있습니다.

>>> rows = incorrect 
>>> cols = [[row[i] for i in range(len(rows[0]))] for row in rows] 
>>> cols = [[row[i] for row in rows] for i in range(len(row))] 
>>> cols 
[[4, 6, 3, 9, 7, 8, 1, 5, 2], [1, 5, 9, 6, 3, 2, 4, 8, 7], [2, 8, 7, 4, 5, 1, 9, 3, 6], [3, 9, 5, 2, 1, 7, 6, 4, 8], [6, 4, 2, 3, 8, 9, 5, 7, 1], [7, 1, 8, 5, 4, 6, 3, 2, 9], [8, 3, 
1, 7, 6, 4, 2, 9, 5], [5, 2, 6, 8, 9, 3, 7, 1, 4], [1, 7, 4, 1, 2, 5, 8, 6, 3]] 
>>> rows 
[[4, 1, 2, 3, 6, 7, 8, 5, 1], [6, 5, 8, 9, 4, 1, 3, 2, 7], [3, 9, 7, 5, 2, 8, 1, 6, 4], [9, 6, 4, 2, 3, 5, 7, 8, 1], [7, 3, 5, 1, 8, 4, 6, 9, 2], [8, 2, 1, 7, 9, 6, 4, 3, 5], [1, 4, 
9, 6, 5, 3, 2, 7, 8], [5, 8, 3, 4, 7, 2, 9, 1, 6], [2, 7, 6, 8, 1, 9, 5, 4, 3]] 
+0

고마워요. 나는 동시에 두리스트를 루핑하기 위해 파이썬 문서를 참조한 후에'zip (array, transposed)'를 사용했다. (http://docs.python.org/tutorial/datastructures.html#looping-techniques). 내 목표는 배열의 행과 열을 모두 확인하는 것이 었습니다. 'transposed'는 단 하나의'if' 문으로 목록을 반복 할 수 있다고 생각했습니다. – poteto

+0

@poteto 행을 검사하고 열을 검사하는 것이 다른 두 가지 일이라는 점을 감안할 때, 나는 그것이 지퍼를 짚고 비교하는 것이 합리적이라고 생각하지 않습니다. 그러나 한 번에 한 행과 한 열을 반복 할 경우 행과 열을 사용하여 zip (행, 열) 행에 대해 행할 수 있습니다. 또한 지금 당장 스도쿠가 유효하다는 것을 증명하지 않고 있다는 것을 주목할 필요가 있습니다. 단지 숫자 1-9가 각 행과 열에 있다는 것입니다. –

+0

예를 들어 주셔서 감사합니다! 모든 행과 열에 1-9 (반복 없음 또는 범위를 벗어난 숫자)가 포함되어 있으면 정의에 따라 스도쿠가 유효하지 않습니까? 나는 잘못된 스도쿠가이 시험에 합격 할 경우를 생각할 수 없다. – poteto