启动用于迭代 Python 列表的索引

在 Python 中迭代列表时,设置开始索引的最佳方法是什么。例如,我有一个星期天的列表-星期天、星期一、星期二、 ... ... 星期六-但是我想从星期一开始迭代这个列表。这样做的最佳实践是什么?

219499 次浏览

You can use slicing:

for item in some_list[2:]:
# do stuff

This will start at the third element and iterate to the end.

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.

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):
...

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

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 )

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']
>>>

stdlib will hook you up son!

deque.rotate():

#!/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'])

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])

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