开始索引以迭代Python列表


88

在Python中迭代列表时,设置起始索引的最佳方法是什么。例如,我有一个星期几的列表-星期日,星期一,星期二,...星期六-但我想从星期一开始遍历该清单。最佳做法是什么?


1
您是否只想循环至周六,还是要在最后一个周日打印并打印?
juanchopanza

我只是想循环到周六。直到现在我才意识到您可以在Python列表中使用切片。
文森特·卡塔拉诺

是否有一种解决方案,不仅可以处理列表,还可以处理生成器/可迭代对象?还是真的很大?
查理·帕克

Answers:


174

您可以使用切片

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

这将从第三个元素开始,然后迭代到结束。


2
这正是我想要的。谢谢!
文森特·卡塔拉诺

30
对于大型列表而言,这不是效率低下吗?我相信此分片操作必须将正在引用的列表元素复制到新列表中。
UndeadKernel 2014年

4
是的,这对于大型列表而言效率不高。有关无法复制的解决方案,请参见下面的咬人问题答案。
比约恩·波莱克斯(BjörnPollex)2014年

如果您正在使用生成器/可迭代对象循环,该怎么办?
查理·帕克

2
您应使用islice,如John La Rooy的答案中所建议。
比约恩·波莱克斯(BjörnPollex)


13

您可以始终使用索引计数器来进行常规C样式循环的循环:

for i in range(len(l)-1):
    print l[i+1]

最好遵循“在每个元素上循环”的样式,因为这是正常的事情,但是如果它妨碍了您,请记住,始终也支持常规样式。


9

stdlib会吸引你的儿子!

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

4

如果您只想从头Monday开始打印,则可以使用listindex方法来查找“星期一”在列表中的位置,然后按照其他帖子中的说明从那里进行迭代。使用list.index可以节省对“星期一”索引的硬编码,这是潜在的错误来源:

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d

真的很好的解决方案!
aderchox

3

这是一个旋转生成器,它不需要制作输入序列的扭曲副本...如果输入序列远大于7个项目,则可能会很有用。

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

是的-并且很容易扩展以生成无限的重复序列。
slothrop 2011年

不禁感谢@JohnMachin:对于这264年逝世的人来说,这是很棒的工作
jjon 2015年

1

人们为什么要使用列表切片(速度很慢,因为它会复制到新列表中),导入库函数或为此尝试旋转数组?

将普通的for循环与range(start, stop, step)(where startandstep是可选参数)。

例如,循环遍历从索引1开始的数组:

for i in range(1, len(arr)):
    print(arr[i])

0

如果您想“环绕”并有效地旋转列表,使其从星期一开始(而不是仅仅砍掉星期一之前的项目):

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 )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.