2014-01-22 3 views
0

터플로 보드 (체스 보드처럼) 표현이 필요하다고 가정 해 봅시다.
우리는 사각형의 (x, y) 좌표와 게임에 대한 캐릭터가있는 경우와 같은 추가 정보를 필요로합니다.터플의 튜플을 생성하여이를 수퍼 클래스의 생성자에 전달하는 방법

n = 4 
array =() 
j = 0 
i = 0 
for k in range(n*n): 
    array = array + ((i,j, 0),) 
    j += 1 
    if j%4 == 0: 
     j = 0 
     i += 1 

이 그렇게 할 수있는 올바른 방법이다 :이 같은 빈 게임 보드 -

그래서 나는 튜플의 튜플을 생성? 아니면 짧은 길이 있습니까?
배열을 수퍼 클래스에 전달합니다.

나는 또한 본 적이 :

튜플의 튜플 또는 목록튜플을 생성
super(className, self).__init__(tuple([0 for j in range(n)]), None) 

? ... 그리고 수퍼 클래스 생성자에 전달합니다.
또한 누군가가 0 for j in range(n)을 설명 할 수 있습니까? (. 그것은 목록의 경우 버그 나,이 목록의 초기화 될 수 0이야?)

답변

2

당신은이 같은 코드 리팩토링 수 있습니다 : 이것은

def empty_board(n): 
    return tuple(
     (i, j, 0) for i in range(n) for j in range(n)) 

내부 generator expression (ref) tuple 에의 호출. 생성기를 포함한 반복 가능한 튜플을 생성합니다.

튜플을 사용하는 것은 변경 불가능하기 때문에 좋은 생각이 아닐 수 있습니다. 따라서 주어진 튜플의 세 번째 요소를 1로 변경할 수 없습니다.

In [5]: board = empty_board(4) 

In [6]: board[5][2] = 1 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-6-506047481a47> in <module>() 
----> 1 board[5][2] = 1 

TypeError: 'tuple' object does not support item assignment 

또한 필드 좌표를 저장하는 것이 약간 중복 된 것처럼 보입니다. 이 같은 대신 중첩 된 목록의 인덱스를 사용할 수 있습니다

In [7]: def mutable_board(n): 
    ...:  return [[0]*n for _ in range(n)] 
    ...: 

In [8]: mutable_board(3) 
Out[8]: [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

In [9]: board = mutable_board(4) 

In [10]: board[2][3] = 1 

는 슈퍼 클래스 생성자 인자에 대한 질문에 대답하려면, 그냥 튜플의 :

In [12]: tuple([0 for j in range(n)]) 
Out[12]: (0, 0, 0, 0) 
+0

답장을 보내 주셔서 감사합니다. Lev! 나는이 구문 ('(i, j, 0) for range (n) in j (n)'을 가진 객체를 생성 할 수 있는지 몰랐다. 불행히도, 제대로 작동하려면 수퍼 클래스 튜플을 사용해야합니다. – Chris

+0

@Chris 구문을 설명하기 위해 몇 가지 링크를 추가했습니다. 이것은 생성자 표현이라고 불리며 목록 이해와 유사하게 작동하지만 반복 할 때마다 하나씩 요소를 제공하는 대신 전체 목록을 생성하지는 않습니다. –

+0

하지만 작성한 표현식이 요소를 하나씩 생성한다면, 슈퍼 클래스 생성자는 어떻게 처리할까요? – Chris

0

보드를 나타내는 들어, 고려했다 n 목록의 목록, 각 n 항목 길이 (n은 보드 너비/높이)?

마지막에 질문하는 목록 이해는 __init__에 n 개의 0 인 단일 튜플을 전달합니다.

+0

답변 해 주셔서 감사합니다.하지만 불행히도 수퍼 클래스가 올바르게 작동하려면 튜플을 사용해야합니다.그래서 처음에 n + 1 개의 새로운리스트를 생성 한 다음 그리스트를 튜플로 변환합니다. 0 뒤에 쉼표가 없어야합니까? 아니면 튜플이있을 때만 가능합니까? – Chris

+1

0 다음의 쉼표는 구문 오류입니다. 어떻게 작동하는지에 대한 느낌을 얻기 위해 쉘에서 놀아 볼 것을 제안합니다. 'tuple (범위 (5)의 j에 대해 0)')'으로 시작하고 변형을 시도하십시오. 또한 [tuple syntax] (https://wiki.python.org/moin/TupleSyntax) 및 [list comprehensions] (http://docs.python.org/2/tutorial/datastructures)에서 파이썬 문서를 확인하십시오. .html # list-comprehensions). –

+0

나는 지금 그것을 시도하고 두 가지 문서를 읽었습니다. 심판을 가져 주셔서 감사합니다 :) – Chris

관련 문제