2

Similar question asked here (Start index for iterating Python list), but I need one more thing.

Assume I have a list [Sunday, Monday, ...Saturday], and I want to iterate the list starting from different position, wrap around and complete the loop. For example

a = [Sunday, Monday, ...Saturday]
for i in range(7):
    print("----")
    for j in (SOMETHING):
        print(j)

OUTPUT:
----
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
----
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
----
Tuesday
.
.
.
Friday

How could I approach this?

yatu
  • 86,083
  • 12
  • 84
  • 139
hcchiu1202
  • 61
  • 6
  • I got a eureka moment. ```python a[i:]+a[:i] ``` will do. I am not going to retract this post because I consider it might be helpful to someone else. – hcchiu1202 Sep 13 '19 at 08:23
  • 2
    then you should put this comment as an answer and mark it as accepted – olinox14 Sep 13 '19 at 08:24
  • 1
    Possible duplicate of [Efficient way to rotate a list in python](https://stackoverflow.com/questions/2150108/efficient-way-to-rotate-a-list-in-python) – olinox14 Sep 13 '19 at 08:26
  • Possible duplicate of [Circular list iterator in Python](https://stackoverflow.com/questions/23416381/circular-list-iterator-in-python) – Diptangsu Goswami Sep 13 '19 at 08:31

8 Answers8

3

One approach would be using collections.deque:

from collections import deque
from itertools import repeat

d = deque(['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'])

n = 7
for i in repeat(d, n):
    print(*i, sep='\n')
    print('-----')
    i.rotate(-1)

Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
-----
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
-----
Tuesday
.
.
.

Though you might find more interesting to create a nested list:

n = 7
l = []
for i in repeat(d, n):
    sl = []
    for j in i:
        sl.append(j)
    l.append(sl)
    i.rotate(-1)

print(l)
# [['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], 
#  ['Monday', 'Tuesday', 'Wednesday'...
yatu
  • 86,083
  • 12
  • 84
  • 139
  • Thank you for your answer. Does this approach create 7 lists in the memory? – hcchiu1202 Sep 13 '19 at 08:37
  • `repeat` is wimsply repeating the fed iterator 7 times, and here the result is simply printed, which seems to be what you trying to do @user12062120 – yatu Sep 13 '19 at 09:07
1

It can be done by:

a[i:]+a[:i]
hcchiu1202
  • 61
  • 6
1

You could pop the start item off and add it to the end.

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for _ in range(7):
    print("----")
    print("\n".join(days))
    days.append(days.pop(0))
Chris Doyle
  • 10,703
  • 2
  • 23
  • 42
1

You can use collections.dequeue, which has a rotate method. However, if you want to make it on your own you can do it like this:

>>> a = ['a','b','c','d']
>>> counter = 0
>>> start_index=2
>>> while counter < len(a):
...     print(a[start_index])
...     start_index+=1
...     counter += 1
...     if start_index==len(a):
...             start_index=0
... 
c
d
a
b

This is quite optimal, because you do not need to make any copy or create a new list, just iterate.

Marek Justyna
  • 214
  • 3
  • 15
0

Use itertools.cycle

from itertools import cycle

counter = 1
days = ['Sunday', 'Monday', 'Tuesday']
for day in cycle(days):
    print(day)
    counter += 1
    if counter == 7:
        print('-----')
        counter = 1
Diptangsu Goswami
  • 5,554
  • 3
  • 25
  • 36
0

Use the following function:

def cycle_list(l, i):
 for element in l[i:]:
  yield element
 for element in l[:i]:
  yield element
Sawel
  • 929
  • 7
  • 17
0

If you don't want to import any libraries.

DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for i in range(7):
    print("----")
    for j in range(len(DAYS)):
        print(DAYS[(j+i) % len(DAYS)])
0

you can chain the elements starting from your current index (in your case the current index is i) with the elements before current index using generators, in this way you will not create new lists, will be memory-efficient:

a = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']

from itertools import chain
for i in range(7):
    print("----")
    for j in chain((e for e in a[i:]), (e for e in a[:i])):
        print(j)

output:

----
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
----
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
----
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
----
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
----
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
----
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
Thursday
----
Saturday
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
kederrac
  • 16,819
  • 6
  • 32
  • 55