2011-05-27 86 views
39

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

+1

你只是想循环,直到周六,或者你希望它环绕和打印星期天持续多久? – juanchopanza 2011-05-27 07:09:17

+0

我只是想循环到周六。直到现在我才意识到,你可以在Python列表中使用切片。 – 2011-05-27 15:49:39

+0

是否有解决方案,也处理生成器/迭代器,而不仅仅是列表?还是真的很大的名单? – 2017-08-09 17:03:24

回答

82

您可以使用slicing

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

这将开始第三个元素和迭代到最后。

+1

这正是我所期待的。谢谢! – 2011-05-27 15:50:15

+4

对于大型列表来说这不是没有效率吗?我相信这种切片操作必须将被引用的列表元素复制到新列表中。 – UndeadKernel 2014-05-13 13:41:53

+1

是的,这对于大型列表来说是低效的。请参阅下面的gnibblers回答以获得不复制的解决方案。 – 2014-05-13 14:20:53

7

你总是可以使用索引循环计数器常规的C风格的循环:

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

它始终是更好地遵循“循环每个元素的”风格,因为这是做正常的事情,但如果它在你的方式,只要记住常规风格也支持,总是。

16

islice有它并不需要复制该列表的一部分

from itertools import islice 
for day in islice(days, 1, None): 
    ... 
2

如果你想要的是从Monday打印起的优势,你可以使用listindex方法找到位置其中“星期一”在列表中,并按照其他帖子中的解释从那里进行迭代。使用list.index节省您的硬编码索引的“星期一”,这是错误的潜在来源:

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] 
for d in days[days.index('Monday'):] : 
    print d 
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) 
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'] 
>>> 
+0

是的 - 并且很容易扩展以生成无限循环序列。 – slothrop 2011-05-27 09:30:57

+0

不禁感谢@JohnMachin:对于这264年来死去的人的伟大工作 – jjon 2015-09-22 00:53:21

5

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