Welcome, guest | Sign In | My Account | Store | Cart

A post-it function to cycle through some sequence. Better use itertools.cycle if for any iterable.

Python, 47 lines
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def cycle(seq):
    """Return a generator producing items from seq. When seq is
    exhausted, the generator will cycle over from item 0 again.

    Beware that a break statement is necessary in a for loop. Also, seq
    is a sequence supporting the len function and enumerated 0-based.

    Examples:

    >>> seq = ['one', 'two', 'three']
    >>> cyc = cycle(seq)
    >>> next(cyc)
    'one'
    >>> next(cyc)
    'two'
    >>> next(cyc)
    'three'
    >>> next(cyc)
    'one'
    >>> next(cyc)
    'two'

    To reset, call for a new cycle:

    >>> cyc = cycle(seq)
    >>> next(cyc)
    'one'
    >>> for i, item in enumerate(cyc):
    ...     print i, item
    ...     if i > 3:
    ...         break # Must break out manually
    ... 
    0 two
    1 three
    2 one
    3 two
    4 three

    """
    i = 0
    while True:                 # Cycle forever
        yield seq[i]
        i = (i + 1) % len(seq)

if __name__ == '__main__':
    import doctest
    doctest.testmod()

This solution could possibly be of interest if any worries for, as the documentation for itertools.cycle say, "significant auxiliary storage". This way no extra memory is used I guess.

Also, as usual when I write something, I realize afterward that the solution is already out there.

Created by Tomas Nordin on Sat, 20 Sep 2014 (MIT)
Python recipes (4591)
Tomas Nordin's recipes (6)

Required Modules

  • (none specified)

Other Information and Tasks