## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# 19.17. Duplicating an Iterator

Credit: Heiko Wundram, Raymond Hettinger

## Problem

You have an iterator (or other iterable) object `x`, and need to iterate twice over `x`'s sequence of values.

## Solution

In Python 2.4, solving this problem is the job of function `tee` in the standard library module `itertools`:

```import itertools
x1, x2 = itertools.tee(x)
# you can now iterate on x1 and x2 separately```

In Python 2.3, you can code `tee` yourself:

```import itertools
def tee(iterable):
def yield_with_cache(next, cache={  }):
pop = cache.pop
for i in itertools.count( ):
try:
yield pop(i)
except KeyError:
cache[i] = next( )
yield cache[i]
it = iter(iterable)
return yield_with_cache(it.next), yield_with_cache(it.next)```

## Discussion

The need to iterate repeatedly over the same sequence of values is a reasonably common one. If you know that the sequence comes from a list, or some other container that intrinsically lets you iterate over its items repeatedly, then you simply perform the iteration twice. However, sometimes your sequence may come from a generator, a sequential file (which might, e.g., wrap a stream of data coming from a network socket—data that you can read only once), or some other iterator that is not intrinsically re-iterable. Even then, in some cases, the best approach is the simplest one—first save the data into a list in memory, then repeatedly iterate over that list:

```saved_x = list(x)
for item in saved_x: do_something(item)
for item in saved_x: do_something_else(item)```

The simple approach of first saving ...

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required