Velocity Reviews > cyclic iterators ?

# cyclic iterators ?

Tool69
Guest
Posts: n/a

 03-03-2007
Hi,

Let say I've got a simple list like my_list = [ 'a', ',b', 'c' ].
We can have an iterator from it by k = iter( my_list), then we can
access each of her (his ?) element by k.next(), etc.

Now, I just wanted k to have the following cyclic behaviour (without
rising the ) :

>> k.next()

'a'
>> k.next()

'b'
>> k.next()

'c'
>> k.next() -> not raising StopIteration error

'a'
>> k.next()

'b'
etc.

I've tried something like this to have a cyclic iterator without
sucess:

def iterate_mylist(my_list):
k = len((my_list)
i=0
while i <= k :
yield my_list[i]
i += 1
i = 0
yield my_list[0]

I missed something, but I don't know what exactly.
Thanks.

Paul Rubin
Guest
Posts: n/a

 03-03-2007
"Tool69" <> writes:
> I've tried something like this to have a cyclic iterator without
> sucess:
>
> def iterate_mylist(my_list):
> k = len((my_list)
> i=0
> while i <= k :
> yield my_list[i]
> i += 1
> i = 0
> yield my_list[0]
>
> I missed something, but I don't know what exactly.

As Bruno says, you can use itertools.cycle, but the problem above is
that you're not looping repeatedly through the list; you yield all the
elements, then yield the first element again, then stop. So for
['a','b','c'] you'd yield the sequence a,b,c,a.

I'd rewrite the above something like:

def iterate_mylist(my_list):
while True:
for m in my_list:
yield m

This just loops through the list over and over again.

Bruno Desthuilliers
Guest
Posts: n/a

 03-03-2007
Tool69 a écrit :
> Hi,
>
> Let say I've got a simple list like my_list = [ 'a', ',b', 'c' ].
> We can have an iterator from it by k = iter( my_list), then we can
> access each of her (his ?) element by k.next(), etc.
>
> Now, I just wanted k to have the following cyclic behaviour (without
> rising the ) :
>
>
>>>k.next()

> 'a'
>>>k.next()

> 'b'
>>>k.next()

> 'c'
>>>k.next() -> not raising StopIteration error

> 'a'
>>>k.next()

> 'b'
> etc.
>

> I've tried something like this to have a cyclic iterator without
> sucess:
>

(snip code)

> I missed something, but I don't know what exactly.

from itertools import cycle

HTH

tool69
Guest
Posts: n/a

 03-03-2007
Paul Rubin a écrit :
>
> As Bruno says, you can use itertools.cycle, but the problem above is
> that you're not looping repeatedly through the list; you yield all the
> elements, then yield the first element again, then stop. So for
> ['a','b','c'] you'd yield the sequence a,b,c,a.

Yes, that was the problem.
Thanks for the explanation and for the cycle() function from itertool
that I missed.

MRAB
Guest
Posts: n/a

 03-03-2007
On Mar 3, 1:27 am, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:
> "Tool69" <kibleur.christo...@gmail.com> writes:
> > I've tried something like this to have a cyclic iterator without
> > sucess:

>
> > def iterate_mylist(my_list):
> > k = len((my_list)
> > i=0
> > while i <= k :
> > yield my_list[i]
> > i += 1
> > i = 0
> > yield my_list[0]

>
> > I missed something, but I don't know what exactly.

>
> As Bruno says, you can use itertools.cycle, but the problem above is
> that you're not looping repeatedly through the list; you yield all the
> elements, then yield the first element again, then stop. So for
> ['a','b','c'] you'd yield the sequence a,b,c,a.
>
> I'd rewrite the above something like:
>
> def iterate_mylist(my_list):
> while True:
> for m in my_list:
> yield m
>
> This just loops through the list over and over again.
>

Another problem is that it should be i < k, not i <= k.