파이썬에서는 두 가지 다른 종류의 반복자를 지원하는 클래스를 작성하려고합니다. 대충 말하자면,이 객체는 데이터 행렬을 포함하고 있으며 행 반복과 열 반복을 지원하는 두 가지 다른 유형의 반복자를 원합니다.하나의 파이썬 객체에 이중 반복자
답변
좋아요, 좋아, 그래서 각각이 발전기 인 두 개의 분리 된 방법을 만드십시오. 나는 전혀 __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__
는 하나 기본적으로 다른 반복 할 수있다.
이게 당신이 찾고 있는게 있나요? 당신은 필요에 따라 각 열을 만들려면
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
사용할 수 있습니다.
또한 실제 값의 반복을 클래스로 이동할 수 있습니다. 행/열 (그림과 같이) 또는 (행/열)의 값을 반복 할 것인지 확실하지 않았습니다.
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
iterrows의 구현을 위해 xrange (0, self.n * self.n, self.n)에서 start (self.data [start : start + self.n])를 사용하지 않으시겠습니까? –
필자는 자기를 끌어 올리는 것을 선호합니다. 편리 할 때 반복문에서 어떤 조회가 나오는지 - 반복 중에는 변경되지 않아도되지만 Python은 최적화를 수행하지 않습니다. 그러나 효율적으로 반복하는 방법은 여러 가지가 있습니다. 두 가지 경우의 대칭성이 마음에 듭니다. –
- 1. 파이썬 게으른 반복자
- 2. 파이썬 반복자 및 스레드 안전
- 3. 파이썬 이중 반복
- 4. 파이썬 객체에 속성 추가하기
- 5. 반복자 단점
- 6. 외부 반복자 대 내부 반복자
- 7. 플렉스에서 하나의 라벨에 이중 색상이 있음 3
- 8. 문자열과 정수를 하나의 객체에 저장할 수 있습니다.
- 9. 하나의 자료 만 여러 객체에 적용됨
- 10. 벡터 반복자
- 11. Java : 반복자
- 12. 반복자 문제
- 13. 순서가 지정된 항복 형 파이썬 반복자 세트에 합치기
- 14. 파이썬 반복자 : iglob()의 반복자가 glob()의리스트를 제공합니까?
- 15. boost :: variant에 대한 반복자
- 16. C에서 (의) 반복자 유형 ++ (STL)
- 17. JQuery와 반복자 기능은
- 18. 호출 가능 반복자 탐색
- 19. C++ 반복자 문제
- 20. 부스트 파일 시스템 반복자
- 21. PHP 지연로드 반복자
- 22. Rails의 데이터 반복자?
- 23. 반복자 분류 코드에서
- 24. C++ 컨테이너의 반복자
- 25. cpp 반복자 문제
- 26. 반복자 저장 참조
- 27. 힙 반복자 java
- 28. 중첩 된 반복자 오류
- 29. 벡터 끝 반복자
- 30. 범위 연산자와 반복자
matrix'에서 행에 대해 '쓰기 능력은 따라서이 전혀 __iter__가없는 것보다 어떻게 든 __iter__ 정의하는 것이 좋습니다 파이썬 구문의 필수적인 부분입니다. – jfs