用于迭代 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 循环(其中startstep 是可选参数)。

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

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

【讨论】:

这应该是真正的答案【参考方案6】:

如果您只想从Monday 开始打印,您可以使用listindex 方法查找“星期一”在列表中的位置,然后按照其他帖子中的说明从那里进行迭代.使用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 列表的开始索引的主要内容,如果未能解决你的问题,请参考以下文章

Python中的列表和元组

(Python)列表索引超出范围-迭代[重复]

Python基本知识3----序列

从零开始的Python学习Episode 12——迭代器&生成器

python之切片与迭代

Python的函数有哪些