What is the best way to set a start index when iterating a list in Python. For example, I have a list of the days of the week - Sunday, Monday, Tuesday, ... Saturday - but I want to iterate through the list starting at Monday. What is the best practice for doing this?
-
1Do you just want to loop until Saturday, or do you want it to wrap around and print Sunday last? – juanchopanza May 27 '11 at 07:09
-
I just wanted to loop until Saturday. I hadn't realized until now that you can use slicing in Python lists. – Vincent Catalano May 27 '11 at 15:49
-
is there a solution that deals with generators/iterables too and not only lists? Or really large lists? – Charlie Parker Aug 09 '17 at 17:03
9 Answers
You can use slicing:
for item in some_list[2:]:
# do stuff
This will start at the third element and iterate to the end.

- 75,346
- 28
- 201
- 283
-
41Isn't this inefficient for large lists? I believe this slice operation has to copy the list elements that are being referenced into a new list. – UndeadKernel May 13 '14 at 13:41
-
6Yes this is inefficient for large lists. See gnibblers answer below for a solution that doesn't copy. – Björn Pollex May 13 '14 at 14:20
-
how do u do this though if u are looping using a generators/iterables? – Charlie Parker Aug 09 '17 at 17:02
-
2The you should use `islice`, as suggested in John La Rooy's answer. – Björn Pollex Aug 09 '17 at 17:39
-
@CharlieParker For more functions supporting generators/iterables, take a look at [toolz](http://toolz.readthedocs.io), specifically [`drop`](http://toolz.readthedocs.io/en/latest/api.html#toolz.itertoolz.drop). – Björn Pollex Aug 09 '17 at 17:40
-
-
@SanketParchande I've renamed the variable to avoid the name-clash with the builtin `list`. Don't name your list `list`. – Björn Pollex Feb 23 '18 at 07:31
islice
has the advantage that it doesn't need to copy part of the list
from itertools import islice
for day in islice(days, 1, None):
...

- 295,403
- 53
- 369
- 502
Why are people using list slicing (slow because it copies to a new list), importing a library function, or trying to rotate an array for this?
Use a normal for-loop with range(start, stop, step)
(where start
and step
are optional arguments).
For example, looping through an array starting at index 1:
for i in range(1, len(arr)):
print(arr[i])

- 427
- 4
- 8
You can always loop using an index counter the conventional C style looping:
for i in range(len(l)-1):
print l[i+1]
It is always better to follow the "loop on every element" style because that's the normal thing to do, but if it gets in your way, just remember the conventional style is also supported, always.

- 84,407
- 47
- 135
- 168
stdlib will hook you up son!
#!/usr/local/bin/python2.7
from collections import deque
a = deque('Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '))
a.rotate(3)
deque(['Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday'])

- 75,346
- 28
- 201
- 283

- 27,321
- 5
- 74
- 91
If all you want is to print from Monday
onwards, you can use list
's index
method to find the position where "Monday" is in the list, and iterate from there as explained in other posts. Using list.index
saves you hard-coding the index for "Monday", which is a potential source of error:
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
print d

- 223,364
- 34
- 402
- 480
Here's a rotation generator which doesn't need to make a warped copy of the input sequence ... may be useful if the input sequence is much larger than 7 items.
>>> def rotated_sequence(seq, start_index):
... n = len(seq)
... for i in xrange(n):
... yield seq[(i + start_index) % n]
...
>>> s = 'su m tu w th f sa'.split()
>>> list(rotated_sequence(s, s.index('m')))
['m', 'tu', 'w', 'th', 'f', 'sa', 'su']
>>>

- 81,303
- 11
- 141
- 189
-
Yes - and would be easy to extend to generate an infinite recurring sequence. – slothrop May 27 '11 at 09:30
-
can't help thanking @JohnMachin: great work for someone dead these 264 years – jjon Sep 22 '15 at 00:53
If you want to "wrap around" and effectively rotate the list to start with Monday (rather than just chop off the items prior to Monday):
dayNames = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
'Friday', 'Saturday', ]
startDayName = 'Monday'
startIndex = dayNames.index( startDayName )
print ( startIndex )
rotatedDayNames = dayNames[ startIndex: ] + dayNames [ :startIndex ]
for x in rotatedDayNames:
print ( x )

- 3,218
- 1
- 18
- 11
Loop whole list (not just part) starting from a random pos efficiently:
import random
arr = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
cln = len(arr)
start = random.randint(0, cln-1)
i = 0
while i < cln:
pos = i+start
print(arr[pos if pos<cln else pos-cln])
i += 1

- 31
- 4