cyclic iterators ?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Tool69

    #1

    cyclic iterators ?

    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.

  • Bruno Desthuilliers

    #2
    Re: cyclic iterators ?

    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

    Comment

    • Paul Rubin

      #3
      Re: cyclic iterators ?

      "Tool69" <kibleur.christ ophe@gmail.comw rites:
      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.

      Comment

      • tool69

        #4
        Re: cyclic iterators ?

        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.

        Comment

        • MRAB

          #5
          Re: cyclic iterators ?

          On Mar 3, 1:27 am, Paul Rubin <http://phr...@NOSPAM.i nvalidwrote:
          "Tool69" <kibleur.christ o...@gmail.comw rites:
          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.

          Comment

          Working...