Need to add an element at the start of an iterator in python

Python iterators, as such, have very limited functionality -- no "appending" or anything like that. You'll need to wrap the generic iterator in a wrapper adding that functionality. E.g.:

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)

This is Python 2.5 (should work in 2.6 too) -- slight variants advised for 2.6 and mandatory for 3.any (use next(self.it) instead of self.it.next() and define __next__ instead of next).

Edit: the OP now says what they need is "peek ahead without consuming". Wrapping is still the best option, but an alternative is:

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

this doesn't advance o (remember to advance it if and when you decide you DO want to;-).


By design (in general development concepts) iterators are intended to be read-only, and any attempt to change them would break.

Alternatively, you could read the iterator backwards, and add it to the end of hte element (which is actually the start :) )?


You're looking for itertools.chain:

import itertools

values = iter([1,2,3])  # the iterator
value = 0  # the value to prepend to the iterator

together = itertools.chain([value], values)  # there it is

list(together)
# -> [0, 1, 2, 3]