2009-06-22 4 views
2

파이썬에서는 두 가지 다른 종류의 반복자를 지원하는 클래스를 작성하려고합니다. 대충 말하자면,이 객체는 데이터 행렬을 포함하고 있으며 행 반복과 열 반복을 지원하는 두 가지 다른 유형의 반복자를 원합니다.하나의 파이썬 객체에 이중 반복자

답변

2

좋아요, 좋아, 그래서 각각이 발전기 인 두 개의 분리 된 방법을 만드십시오. 나는 전혀 __iter__이없는 권하고 싶습니다하지만

class Matrix(object): 
    def iter_rows(self): 
     for row in self.rows: 
      yield row 

    def iter_columns(self): 
     for column in self.columns: 
      yield column 

당신의 __iter__는 하나 기본적으로 다른 반복 할 수있다.

+0

matrix'에서 행에 대해 '쓰기 능력은 따라서이 전혀 __iter__가없는 것보다 어떻게 든 __iter__ 정의하는 것이 좋습니다 파이썬 구문의 필수적인 부분입니다. – jfs

4

이게 당신이 찾고 있는게 있나요? 당신은 필요에 따라 각 열을 만들려면

class Matrix(object): 
    def __init__(self, rows): 
     self._rows = rows 

    def columns(self): 
     return zip(*self._rows) 

    def rows(self): 
     return self._rows 

# Create a Matrix by providing rows. 
m = Matrix([[1,2,3], 
      [4,5,6], 
      [7,8,9]]) 

# Iterate in row-major order. 
for row in m.rows(): 
    for value in row: 
     print value 

# Iterate in column-major order. 
for column in m.columns(): 
    for value in column: 
     print value 

당신은 itertools.izip 대신 zip 사용할 수 있습니다.

또한 실제 값의 반복을 클래스로 이동할 수 있습니다. 행/열 (그림과 같이) 또는 (행/열)의 값을 반복 할 것인지 확실하지 않았습니다.

5

dict에는 여러 개의 반복자 생성 방법이 있습니다. - iterkeys, itervalues, iteritems - 클래스도 마찬가지입니다. "가장 자연스러운"반복 방법이 있다면 편리함과 가독성을 위해 __iter__으로 별칭을 지정해야합니다 (iterrows이 될 것입니다. 물론 dict과 같이 그 중 일부는 항상 의심의 여지가 있습니다). 반복 동작이지만 합리적인 선택은 없음보다 낫습니다.

예를 들어 행렬이 정사각형이고 행 주요 목록 self.data으로 평탄화되고 측면이 self.n 인 것으로 가정합니다. 그런 다음 :

def iterrows(self): 
    start = 0 
    n = self.n 
    data = self.data 
    while start < n*n: 
    stop = start + n 
    yield data[start:stop] 
    start = stop 

def itercols(self): 
    start = 0 
    n = self.n 
    data = self.data 
    while start < n: 
    yield data[start::n] 
    start += 1 

__iter__ = iterrows 
+0

iterrows의 구현을 위해 xrange (0, self.n * self.n, self.n)에서 start (self.data [start : start + self.n])를 사용하지 않으시겠습니까? –

+0

필자는 자기를 끌어 올리는 것을 선호합니다. 편리 할 때 반복문에서 어떤 조회가 나오는지 - 반복 중에는 변경되지 않아도되지만 Python은 최적화를 수행하지 않습니다. 그러나 효율적으로 반복하는 방법은 여러 가지가 있습니다. 두 가지 경우의 대칭성이 마음에 듭니다. –