2011-05-27 128 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'])