itertools 모듈 문서 의 관련 예제는 다음과 같습니다 .
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
Python 2의 경우 다음 itertools.izip
대신에 필요 합니다 zip
.
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return itertools.izip(a, b)
작동 방식 :
첫째, 두 개의 평행 반복기, a
및 b
(생성되는 tee()
통화), 반복 가능한 원래의 첫 번째 요소를 모두 가리키는. 두 번째 반복자 b
는 1 단계 앞으로 이동합니다 ( next(b, None)
). 이 시점 a
에서 s0을 b
가리키고 s1을 가리 킵니다. 모두 a
와 b
독립적으로 원래의 반복자를 통과 할 수 - izip 기능은 두 반복자를 받아 같은 속도로 두 반복자를 발전 반환 된 요소의 쌍을, 수 있습니다.
한 가지주의 사항 :이 tee()
함수는 서로 독립적으로 진행할 수있는 두 개의 반복자를 생성하지만 비용이 발생합니다. 반복자 중 하나가 다른 반복자보다 tee()
앞당겨진 경우, 두 번째 반복자가 너무 많이 소모 될 때까지 소비 된 요소를 메모리에 유지해야합니다 (원래 반복자를 '되감기'할 수 없음). 하나의 반복자가 다른 반복자보다 한 걸음 앞서 있기 때문에 중요하지 않지만 일반적 으로이 방법으로 많은 메모리를 사용하는 것은 쉽습니다.
그리고 이후 tee()
취할 수있는 n
매개 변수를,이 또한 두 개 이상의 병렬 반복자에 사용할 수 있습니다 :
def threes(iterator):
"s -> (s0,s1,s2), (s1,s2,s3), (s2, s3,4), ..."
a, b, c = itertools.tee(iterator, 3)
next(b, None)
next(c, None)
next(c, None)
return zip(a, b, c)