Is there an peekable similar to peekable but in additional allowing one to put some data to it?
Ian Kelly
ian.g.kelly at gmail.com
Wed Jan 11 12:15:39 EST 2017
On Wed, Jan 11, 2017 at 10:07 AM, Ian Kelly <ian.g.kelly at gmail.com> wrote:
> On Wed, Jan 11, 2017 at 8:51 AM, Peng Yu <pengyu.ut at gmail.com> wrote:
>> Hi, peekable from more-itertools only allow peeking an iterator. But
>> sometimes, one may want to take a look at an element, manipulate it,
>> then put it back to the iterator. Is there a class in python that can
>> help do this?
>
> Not that I'm aware of, but maybe this recipe will help.
>
>
> from collections import deque
>
> class PushIterator:
>
> def __init__(self, iterable, push=()):
> self._iter = iter(iterable)
> self._pushed = deque(push)
> self._stopped = False
>
> def push(self, item):
> if self._stopped:
> raise RuntimeError('Cannot push onto exhausted iterator')
> self._pushed.append(item)
>
> def __iter__(self):
> return self
>
> def __next__(self):
> if self._pushed:
> return self._pushed.pop()
> try:
> return next(self._iter)
> except StopIteration:
> self._stopped = True
> raise
And in case it's not obvious, adding a peek method to this is pretty simple:
from collections import deque
class PushIterator:
def __init__(self, iterable, push=()):
self._iter = iter(iterable)
self._pushed = deque(push)
self._stopped = False
def peek(self):
item = next(self)
self.push(item)
return item
def push(self, item):
if self._stopped:
raise RuntimeError('Cannot push onto exhausted iterator')
self._pushed.append(item)
def __iter__(self):
return self
def __next__(self):
if self._pushed:
return self._pushed.pop()
try:
return next(self._iter)
except StopIteration:
self._stopped = True
raise
More information about the Python-list
mailing list