Question: I faced the problem that I dont understand how itertools.takewhile() code works.

```
import itertools

z = [3,3,9,4,1]

zcycle = itertools.cycle(z)
next_symbol = zcycle.next()
y = list(itertools.takewhile(lambda symbol: symbol == next_symbol or symbol == 9, zcycle))
print y

```

my code suppose to give me elements of the list from the beginning if they are the same or if element is equal to 9. So once we hit element that differs from previous one we should stop.

I expected that the outcome would be `[3, 3]` but instead I got `[3, 9]`. 
Why we miss the very first element of the list?
and is it possible somehow to get output equal to `[3, 3, 9]`?

Answer: 
You removed the first `3` from the sequence here:

```
next_symbol = zcycle.next()

```

That advances `zcycle` to the next element, so it'll yield one more `3`, not two.

Don't call `next()` on the `zcycle` object; perhaps use `z[0]` instead:

```
next_symbol = z[0]

```

Now `zcycle` will yield `3`, then another `3`, then `9`, after which the `takewhile()` condition will be `False` and all iteration will stop.
it is possible to do it with tee an groupby if you had an actul iterator:

```
from itertools import tee, groupby, cycle

z = [3, 3, 9, 4, 1]
zcycle = cycle(z)
a, b = tee(zcycle)
next_symbol = next(b)
grps = groupby(a, key=lambda symbol: symbol in {9, next(b), next_symbol})
g = next(grps)
if g[0]:
    print(list(g[1]))

```