用于迭代 Python 列表的开始索引
Posted
技术标签:
【中文标题】用于迭代 Python 列表的开始索引【英文标题】:Start index for iterating Python list 【发布时间】:2011-09-03 03:59:25 【问题描述】:在 Python 中迭代列表时设置起始索引的最佳方法是什么。例如,我有一个星期的列表 - 星期日,星期一,星期二,......星期六 - 但我想从星期一开始遍历列表。这样做的最佳做法是什么?
【问题讨论】:
您是只想循环播放到星期六,还是希望它在最后一个星期天循环播放? 我只想循环到周六。直到现在我才意识到你可以在 Python 列表中使用切片。 是否有一种解决方案也可以处理生成器/可迭代对象,而不仅仅是列表?还是非常大的列表? 【参考方案1】:你可以使用slicing:
for item in some_list[2:]:
# do stuff
这将从第三个元素开始并迭代到最后。
【讨论】:
这正是我想要的。谢谢! 这对于大型列表不是效率低下吗?我相信这个切片操作必须将被引用的列表元素复制到一个新列表中。 是的,这对于大型列表来说效率很低。有关不复制的解决方案,请参阅下面的 gnibbler 答案。 如果你使用生成器/迭代器循环,你怎么做? 您应该使用islice
,正如 John La Rooy 的回答中所建议的那样。【参考方案2】:
islice
的优点是不需要复制部分列表
from itertools import islice
for day in islice(days, 1, None):
...
【讨论】:
【参考方案3】:您始终可以使用索引计数器循环使用传统的 C 样式循环:
for i in range(len(l)-1):
print l[i+1]
遵循“每个元素上的循环”样式总是更好,因为这是正常的做法,但如果它妨碍您,请记住也始终支持常规样式。
【讨论】:
【参考方案4】: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'])
【讨论】:
【参考方案5】:为什么人们要使用列表切片(很慢,因为它会复制到新列表)、导入库函数或尝试为此旋转数组?
使用带有range(start, stop, step)
的普通for 循环(其中start
和step
是可选参数)。
例如,循环从索引 1 开始的数组:
for i in range(1, len(arr)):
print(arr[i])
【讨论】:
这应该是真正的答案【参考方案6】:如果您只想从Monday
开始打印,您可以使用list
的index
方法查找“星期一”在列表中的位置,然后按照其他帖子中的说明从那里进行迭代.使用list.index
可以节省您对“星期一”的索引进行硬编码,这是一个潜在的错误来源:
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
print d
【讨论】:
非常好的解决方案!【参考方案7】:这是一个旋转生成器,它不需要对输入序列进行扭曲副本...如果输入序列远大于 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']
>>>
【讨论】:
是的 - 并且很容易扩展以生成无限循环序列。 忍不住感谢@JohnMachin:为这 264 年来死去的人做了伟大的工作【参考方案8】:如果您想“环绕”并有效地轮换列表以从星期一开始(而不是仅仅在星期一之前删除项目):
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 )
【讨论】:
以上是关于用于迭代 Python 列表的开始索引的主要内容,如果未能解决你的问题,请参考以下文章