2014-11-23 69 views
0

如何迭代從特定索引開始的列表。從python中的特定索引完整迭代列表

例如:

lst = ["a", "b", "c", "d", "e", "f"] 

我要開始list(3)這是"d"迭代,但我要重複,將繼續在所有元素。所以它會按照"d", "e", "f", "a", "b", "c"的順序迭代。

可能嗎?

+1

不要對你的變量'list'。它會與內建列表衝突(https://docs.python.org/2/library/functions.html#list) – BorrajaX 2014-11-23 19:10:37

+0

感謝您編輯它。 – krypt 2014-11-23 19:13:09

回答

4

您可以使用列表分片建立一個新名單對象:

for elem in lst[3:] + lst[:3]: 

這是適合於小清單;創建新的列表對象(用於切片和連接結果)足夠便宜。

演示:

>>> lst = ["a", "b", "c", "d", "e", "f"] 
>>> for elem in lst[3:] + lst[:3]: 
...  print elem, 
... 
d e f a b c 
+0

對我來說工作得非常好。謝謝。 – krypt 2014-11-23 19:24:29

2

您可以使用itertools.cycle將循環迭代器置於列表之外。 然後切片len(seq)元素從迭代器,從指數開始3

In [573]: seq = ["a", "b", "c", "d", "e", "f"] 

In [574]: import itertools as IT 

In [575]: list(IT.islice(IT.cycle(seq), 3, 3+len(seq))) 
Out[575]: ['d', 'e', 'f', 'a', 'b', 'c'] 
+0

這也適用,但由於我將使用這些代碼的列表相對較小,我選擇Martijn的答案。謝謝! – krypt 2014-11-23 19:25:12

2

對於完整性,(雖然我可能會去的Martijn的/ unutbu的方法):

from collections import deque 

lst = ["a", "b", "c", "d", "e", "f"] 

d = deque(lst) 
d.rotate(-3) 
for el in d: 
    # do something 

如果你需要保持旋轉數據和迭代它從一開始或從結束反轉,然後這會更有效率。但是,這意味着您無法直接索引到d - 因爲它實際上是一個雙向鏈接列表。

+0

Deques不是一個選項。我正在處理的代碼遍歷列表直到滿足條件。在迭代過程中,我有時會從列表中刪除元素。 Deque的你不能這樣做。 – krypt 2014-11-23 19:26:38

+0

@krypt要公平 - 從你的問題來看,這並不明顯......遍歷列表並刪除元素也聽起來像是一場災難...... – 2014-11-23 19:28:35

+0

是的,它不是問題的一部分。我只是想說明爲什麼德克不是一種選擇。無論如何非常感謝你! – krypt 2014-11-23 19:35:00

1

這可以通過模數(%)運算符可以輕鬆完成,而無需使用任何軟件包:

>>> for i in range(3,3+len(lst)): 
... print lst[i%len(lst)], 
... 
d e f a b c