2015-10-07 28 views
2

假設你有一個列表,並給出了一個起點(例如第三個索引)。你將如何遍歷從該索引開始的列表,然後循環訪問列表中的所有元素?意思是,你可以在列表中間開始迭代,但一旦你到達最後,你將從頭開始繼續,直到列表中的每個元素都被訪問過。什麼是最乾淨和最有效的方式來做這樣的事情?理想情況下,我正在尋找一些有效的Python僞for x in list starting with i:給定一個起點遍歷一個列表

回答

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)] 
+1

我傾向於使用類似'在範圍(LEN(MYLIST))指數:打印MYLIST [(指數+ START_INDEX)%LEN(MYLIST)]',而不是一個'while'環。 – jonrsharpe

+0

是的,那會更好:)我想我應得的downvote ... – rll

+0

@rll我懷疑這是downvoted因爲那...可能是因爲'我++',你很快刪除。 – vaultah

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): 
    ...