2014-04-06 3 views
0

2D 배열 클래스를 만들려고하고 있는데 문제가 생겼습니다. 필자가 알아낼 수있는 가장 좋은 방법은 get/setitem을 인덱스의 튜플 (tuple)로 전달하고 함수에서이를 언 패킹 (unpack)하도록하는 것입니다. 불행하게도하지만, 구현은 정말 지저분한 같습니다2 차원 배열을 사용하는 더 깨끗한 방법이 있습니까?

class DDArray: 
    data = [9,8,7,6,5,4,3,2,1,0] 

    def __getitem__ (self, index): 
     return (self.data [index [0]], self.data [index [1]]) 

    def __setitem__ (self, index, value): 
     self.data [index [0]] = value 
     self.data [index [1]] = value 

test = DDArray() 

print (test [(1,2)]) 

test [(1, 2)] = 120 

print (test [1, 2]) 
난 그냥 더 많은 매개 변수를 받아 가지고 시도

:

class DDArray: 
    data = [9,8,7,6,5,4,3,2,1,0] 

    def __getitem__ (self, index1, index2): 
     return (self.data [index1], self.data [index2]) 

    def __setitem__ (self, index1, index2, value): 
     self.data [index1] = value 
     self.data [index2] = value 

test = DDArray() 

print (test [1, 2]) 

test [1, 2] = 120 

print (test [1, 2]) 

하지만 내가 충분히 인수를 전달 아니에요 말해 이상한 유형의 오류가 발생을 (나는 첨자 연산자의 내부에 쉼표가 있더라도 1 개의 인수로 간주됩니다.)

은 (예, 알아요, 위 클래스는 실제로는 2 차원 배열이 아닌. 내가 실제로 2D를 만들기로 이동하기 전에 운영자가 파악하고 싶었.)

가하는 표준 방법이 있나요 좀 더 깔끔하게 보이지? 감사합니다.

+3

2 차원 배열이 이미 기본적으로 지원되므로 왜 자신의 2 차원 배열을 작성 하시겠습니까? –

+0

@ Harry Shankar 문서를 빠르게 검색하고 a = [] []을 시도했지만 구문 오류가 발생했습니다. 나는 문서를 열심히 보게 될 것이다. 감사합니다 – Carcigenicate

+1

아. 사용할 수 있기 전에 목록 목록으로 초기화해야합니다 (a = [[]]) – Carcigenicate

답변

1

당신이 할 수있는 몇 가지 방법이 있습니다. test[1][2]과 같은 구문을 원할 경우 __getitem____getitem__으로 다시 색인화되거나 목록을 반환 할 수있는 열 (또는 행)을 반환 할 수 있습니다. 당신이 구문 test[1,2]을 원하는 경우

그러나, 당신이 올바른 궤도에 당신이 그것을 호출 할 때 괄호를 포함 할 필요가 없습니다, test[1,2] 실제로 튜플에게 __getitem__ 기능 (1,2)를 전달합니다.

당신은 그래서 같은 __getitem____setitem__ 구현은 좀 덜 지저분 할 수 있습니다 :

def __getitem__(self, indices): 
    i, j = indices 
    return (self.data[i], self.data[j]) 

을 물론 __getitem__의 실제 구현. 인덱스 튜플을 적절하게 이름 붙여진 변수로 나눈 것입니다.

+0

하리가 실제로 내 질문에 대답했지만 답변이 아니므로 도움이되기 때문에 이것을 선택하겠습니다. – Carcigenicate

관련 문제