启动迭代Python列表的索引

Vin*_*ano 73 python iteration

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

Bjö*_*lex 150

你可以使用切片:

for item in some_list[2:]:
    # do stuff
Run Code Online (Sandbox Code Playgroud)

这将从第三个元素开始并迭代到结尾.

  • 这对大型列表来说效率不高吗?我相信这个切片操作必须将被引用的列表元素复制到新列表中. (16认同)
  • 这正是我想要的。谢谢! (2认同)
  • 是的,这对于大型列表而言效率不高。有关无法复制的解决方案,请参见下面的咬人问题答案。 (2认同)
  • 您应该使用 `islice`,正如 John La Rooy 的回答中所建议的那样。 (2认同)

Joh*_*ooy 35

islice 的优点是它不需要复制部分列表

from itertools import islice
for day in islice(days, 1, None):
    ...
Run Code Online (Sandbox Code Playgroud)


Cha*_* Su 25

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

使用普通的 for 循环 with range(start, stop, step)(其中startstep是可选参数)。

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

for i in range(1, len(arr)):
    print(arr[i])
Run Code Online (Sandbox Code Playgroud)

  • 这应该是真正的答案 (4认同)

Lak*_*sad 12

您始终可以使用传统C样式循环的索引计数器循环:

for i in range(len(l)-1):
    print l[i+1]
Run Code Online (Sandbox Code Playgroud)

遵循"循环每个元素"的风格总是更好,因为这是正常的事情,但如果它妨碍你,只要记住常规风格也是支持的.


syn*_*tel 8

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'])
Run Code Online (Sandbox Code Playgroud)


jua*_*nza 5

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

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


Joh*_*hin 5

这是一个旋转生成器,不需要制作输入序列的扭曲副本……如果输入序列远大于 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']
>>>
Run Code Online (Sandbox Code Playgroud)