假設你有一個列表,並給出了一個起點(例如第三個索引)。你將如何遍歷從該索引開始的列表,然後循環訪問列表中的所有元素?意思是,你可以在列表中間開始迭代,但一旦你到達最後,你將從頭開始繼續,直到列表中的每個元素都被訪問過。什麼是最乾淨和最有效的方式來做這樣的事情?理想情況下,我正在尋找一些有效的Python僞for x in list starting with i:
。給定一個起點遍歷一個列表
2
A
回答
1
如果列表很大,要避免複製列表中的部分,則需要使用自定義的迭代器:
def starting_with(arr, start_index):
# use xrange instead of range in python 2
for i in range(start_index, len(arr)):
yield arr[i]
for i in range(start_index):
yield arr[i]
for value in starting_with(my_list, 3):
...
2
爲了圍繞回去(不itertools),你必須使用除法運算符的餘數:
i = start_index
while i < len(mylist) + start_index:
print mylist[i % len(mylist)]
i+=1
甚至更好,如所指出的@jonrsharpe:
for idx in range(len(mylist)):
print mylist[(idx + start_index) % len(mylist)]
對於爲了完整起見,並且因爲在這種情況下發電機將更有效率,如@RégisB.所示,您可以:
def mygen(lst, start):
for idx in range(len(lst)):
yield lst[(idx + start) % len(lst)]
0
你可以創建你自己的迭代函數,它這個非常得心應手(和有效) , 如下所示。
要注意這一點很重要,因爲寫的,你可以通過它負指數,該列表的長度是有效的加入,讓-2
將意味着第二到最後一個項目在列表—這是哪個究竟Python本身通常如何處理列表負指數。
try:
xrange
except NameError: # Python 3
xrange = range
def starting_with(start_index, seq):
if start_index > 0:
start_index = start_index-len(seq)
for i in xrange(start_index, len(seq)+start_index):
yield seq[i]
for value in starting_with(3, my_list):
...
相關問題
- 1. jstl的遍歷一個列表
- 2. 遞歸遍歷一個Scala列表
- 3. 遍歷一個複選框列表
- 4. 遍歷一個圖表
- 5. 遍歷下一個()表
- 6. 如何遍歷一個列表來創建一個特定的其他列表
- 7. 通過列表遍歷給出一個NullPointerException
- 8. 遍歷兩個列表和一個數值在其他列表
- 9. 序言:遍歷一個列表,並創建一個謂語
- 10. 遍歷每個列表
- 11. 遍歷2個列表
- 12. 遍歷表並返回一個特定的列
- 13. 遍歷一個列表,其中包含一個自引用列表
- 14. 只給出一個遍歷時尋找二叉樹的另外兩個遍歷
- 15. 對所有斷點運行一個「斷點命令列表」/遍歷斷點[GDB]
- 16. 如何遍歷thymeleaf中另一個列表中的列表?
- 17. 遍歷一個列表通過列表模式
- 18. 使用另一個列表遍歷2D列表
- 19. Python的 - 遍歷整個列表並將其分配給一個字典
- 20. 在一些條件下遍歷一個列表
- 21. 遍歷一個特定的記錄
- 22. 從一個節點遍歷XML到另一個使用Python
- 23. 遍歷一個表來獲得計數另一個表
- 24. 遍歷一個臨時表並插入到另一個表
- 25. C++遍歷一個列表來調用某個函數
- 26. 遍歷整個列表並返回一個項目
- 27. 在比較2個元素時遍歷一個列表
- 28. 循環遍歷一個列表,只循環某個類的li?
- 29. 遍歷一個HTML表格元素
- 30. .filter遍歷一個數組
我傾向於使用類似'在範圍(LEN(MYLIST))指數:打印MYLIST [(指數+ START_INDEX)%LEN(MYLIST)]',而不是一個'while'環。 – jonrsharpe
是的,那會更好:)我想我應得的downvote ... – rll
@rll我懷疑這是downvoted因爲那...可能是因爲'我++',你很快刪除。 – vaultah