如何迭代從特定索引開始的列表。從python中的特定索引完整迭代列表
例如:
lst = ["a", "b", "c", "d", "e", "f"]
我要開始list(3)
這是"d"
迭代,但我要重複,將繼續在所有元素。所以它會按照"d", "e", "f", "a", "b", "c"
的順序迭代。
可能嗎?
如何迭代從特定索引開始的列表。從python中的特定索引完整迭代列表
例如:
lst = ["a", "b", "c", "d", "e", "f"]
我要開始list(3)
這是"d"
迭代,但我要重複,將繼續在所有元素。所以它會按照"d", "e", "f", "a", "b", "c"
的順序迭代。
可能嗎?
您可以使用列表分片建立一個新名單對象:
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
對我來說工作得非常好。謝謝。 – krypt 2014-11-23 19:24:29
您可以使用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']
這也適用,但由於我將使用這些代碼的列表相對較小,我選擇Martijn的答案。謝謝! – krypt 2014-11-23 19:25:12
對於完整性,(雖然我可能會去的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
- 因爲它實際上是一個雙向鏈接列表。
這可以通過模數(%)運算符可以輕鬆完成,而無需使用任何軟件包:
>>> for i in range(3,3+len(lst)):
... print lst[i%len(lst)],
...
d e f a b c
不要對你的變量'list'。它會與內建列表衝突(https://docs.python.org/2/library/functions.html#list) – BorrajaX 2014-11-23 19:10:37
感謝您編輯它。 – krypt 2014-11-23 19:13:09