2017-06-11 55 views
1

是否有方法可以循環遍歷Python列表中的所有值,但是從特定索引開始?從特定索引開始迭代所有Python列表值

例如:

li = ['a', 'b', 'c', 'd'] 

開始循環在索引1和打印出的結果。我的預期產出將是:

['b', 'c', 'd', 'a'] 

我知道用兩個「for循環」可以做的工作,但有沒有更好的方式來做到這一點?

+0

列表有多大? – Marat

回答

0

雖然使用內建函數是推薦的方法,但您仍然可以像這樣自己做。

要回答你的問題有關迭代(用簡單的指數操縱):

li = ['a', 'b', 'c', 'd'] 
i_offset = 1 
for i in range(len(li)): 
    print (li[(i+i_offset) % len(li)]) 

要回答你的問題有關打印列表(更Python的方式):

li = ['a', 'b', 'c', 'd'] 
i_offset = 1 
print ([li[(i+i_offset) % len(li)] for i,x in enumerate(li)]) 

無需轉換爲隊列並轉換回列表來實現它。

+0

你說得對,'deque'不是解決問題所必需的 - 但它是內置的(所以每個人都可以訪問它),並且它支持旋轉。所以即使沒有必要使用它,代碼也變得更容易和(可能)更快。請注意,將它轉換回來是完全可選的(如果這並不明顯,我可以在我的答案中更清楚地說明),deque本身就像迭代時的列表一樣。我也很高興你編輯了你的答案,現在它實際上解決了這個問題。 :) – MSeifert

+0

另外請注意,這個問題被標記爲python-3.x,所以你可能應該將括號('()')添加到'print's。 – MSeifert

+0

感謝@ MSeifert的輸入,我編輯了我的答案。你的答案確實很有意思,所以它顯示了一個很好的Python特性,當它更容易使用時,這是使用內置函數的好方法。我不認爲它會更快,因爲Python文檔提到'deque'將所有元素添加到新對象中。你對我的第一個答案是正確的,我不應該那麼晚在那麼晚:) – RaphaMex

3

你可以要麼切片做到這一點:

l2 = [*li[1:], *li[:1]] 
for i in l2: 
    print(i) 

這對蟒蛇> = 3.5工作。對於之前的版本,您可以使用li[1:] + li[:1]chain(li[1:],li[:1])chainitertools

另外,使用來自itertools模塊其它兩個幫手,你可以這樣做:

# call list on it if you need a list object 
it = islice(cycle(li), 1, len(li)+1)  
for i in it: 
    print(i) 

這不會產生額外的名單。

+0

for i in li [1:] + li [:1]:print(i)適用於任何版本的python,並且是IMO最簡單的解決方案。 – Hami

5

嗯,你可以只使用內置collections.deque類,它支持"rotating"

>>> from collections import deque 

>>> li = deque(['a', 'b', 'c', 'd']) 
>>> li.rotate(-1) 
>>> li 
deque(['b', 'c', 'd', 'a']) 

萬一你真的想有一個列表,因此你可以隨時再次將其轉換:

>>> list(li) 
['b', 'c', 'd', 'a'] 
1

您可以定義自己的發電機功能looper,然後循環通過它返回的發電機。生成器函數將列表作爲第一個參數,並將所需的起始索引作爲第二個輸入。模運算符(%)會將索引保留在列表的範圍內。

def looper(my_list, starting_ix): 
    len_ml = len(my_list) 
    for i in range(starting_ix, len_ml + starting_ix): 
     yield my_list[i % len_ml] 

li = ['a', 'b', 'c', 'd'] 

for item in looper(li, 1): 
    print item 
1

這是怎麼回事?

在列表後追加列表,並且迭代start_indexstart_index+len(list)

ary = [1,2,3,4,5] 
start_idx = 3 
for num in (ary+ary)[start_idx:start_idx+len(ary)]: 
    print(num) 
+0

你在'start_idx + len(ary)'之後忘了關閉']'。 「列表後追加列表」也被稱爲「連接」(只是澄清 - 我想每個人都知道你的意思)。 :) – MSeifert

+0

我'修復我的答案錯字。 我不擅長英語,希望你能理解。 – Maybe

+0

你把它插在錯誤的地方:它應該是'[start_idx:start_idx + len(ary)]'(注意最後兩個字符的順序不同)。 :) – MSeifert