2009-08-12 3 views
0

에서 반복자의 시작 부분에 요소를 추가해야합니까? (또는 더 쉬운 방법이 있나요?)다음과 같이 나는 프로그램이 파이썬

편집 :이 방법을 넣어주세요. 반복자에서 요소를 제거하지 않고 다음 요소가 필요합니다. 어떻게해야합니까>?

+0

을, 또는 itertools.tee을 사용, 내 대답을 편집 할 수 있습니다. –

답변

7

Python iterators는 기능이 매우 제한되어 있습니다. "추가"또는 이와 유사한 것은 없습니다. 해당 기능을 추가하는 래퍼에 일반 반복기를 래핑해야합니다. 예컨대 :

class Wrapper(object): 
    def __init__(self, it): 
    self.it = it 
    self.pushedback = [] 
    def __iter__(self): 
    return self 
    def next(self): 
    if self.pushedback: 
     return self.pushedback.pop() 
    else: 
     return self.it.next() 
    def pushback(self, val): 
    self.pushedback.append(val) 

이 파이썬 2.5 (도 2.6에서 작동한다)이다 - 3. 모든 2.6 및 의무에 대한 조언 약간의 변형 (대신 self.it.next()next(self.it)를 사용하는 대신 next__next__을 정의).

편집 : 이제 OP에 "소모하지 않고 계속 들여다보기"라는 메시지가 표시됩니다. 포장은 여전히 ​​최선의 선택이지만, 대안은 다음과 같습니다

import itertools 
    ... 
o, peek = itertools.tee(o) 
if isneat(peek.next()): ... 

o가 (당신이 결정할 때 ;-) 원하는 경우이를 사전에 기억 진행되지 않습니다.

+0

예. 작동합니다. 반복자가 상당히 큽니다. 문제는 없습니다. 다른 방법이 없다면 지금 수행해야합니다. – Goutham

+1

걱정할 필요가 없습니다. 반복기는 래퍼 케이스에 참조로 보관되며 itertools.tee는 여분의 공간을 소비합니다. O (K) 여기서 K는 미리 들여다보아야하는 항목의 수입니다. 따라서 "큰 반복자"는 문제가되지 않습니다! –

2

설계 상 (일반적 개발 개념에서) 반복기는 읽기 전용으로되어 있으며이를 변경하려는 시도는 중단됩니다.

또는 이터레이터를 거꾸로 읽고 hte 요소의 끝에 추가 할 수 있습니다 (실제로 시작 :).)?

0

이것은 너무 가까이있는 것은 아니지만 생성기를 제어 할 수 있고 값이 생성되기 전에 "엿보기"할 필요가없는 경우 (그리고 부작용이 발생한 경우) 사용할 수 있습니다. generator.send 방법이 나왔고 마지막 값 반복 발전기에게 : 당신이 중 하나가 내가 내 대답에 설명 된대로 정확하게 래퍼을

>>> def a(): 
...  for x in (1,2,3): 
...    rcvd = yield x 
...    if rcvd is not None: 
...      yield x 
... 
>>> gen = a() 
>>> gen.send("just checking") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't send non-None value to a just-started generator 
>>> gen.next() 
1 
>>> gen.send("just checking") 
1 
>>> gen.next() 
2 
>>> gen.next() 
3 
>>> gen.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
관련 문제