是否有方法可以循環遍歷Python列表中的所有值,但是從特定索引開始?從特定索引開始迭代所有Python列表值
例如:
li = ['a', 'b', 'c', 'd']
開始循環在索引1和打印出的結果。我的預期產出將是:
['b', 'c', 'd', 'a']
我知道用兩個「for循環」可以做的工作,但有沒有更好的方式來做到這一點?
是否有方法可以循環遍歷Python列表中的所有值,但是從特定索引開始?從特定索引開始迭代所有Python列表值
例如:
li = ['a', 'b', 'c', 'd']
開始循環在索引1和打印出的結果。我的預期產出將是:
['b', 'c', 'd', 'a']
我知道用兩個「for循環」可以做的工作,但有沒有更好的方式來做到這一點?
雖然使用內建函數是推薦的方法,但您仍然可以像這樣自己做。
要回答你的問題有關迭代(用簡單的指數操縱):
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)])
無需轉換爲隊列並轉換回列表來實現它。
你說得對,'deque'不是解決問題所必需的 - 但它是內置的(所以每個人都可以訪問它),並且它支持旋轉。所以即使沒有必要使用它,代碼也變得更容易和(可能)更快。請注意,將它轉換回來是完全可選的(如果這並不明顯,我可以在我的答案中更清楚地說明),deque本身就像迭代時的列表一樣。我也很高興你編輯了你的答案,現在它實際上解決了這個問題。 :) – MSeifert
另外請注意,這個問題被標記爲python-3.x,所以你可能應該將括號('()')添加到'print's。 – MSeifert
感謝@ MSeifert的輸入,我編輯了我的答案。你的答案確實很有意思,所以它顯示了一個很好的Python特性,當它更容易使用時,這是使用內置函數的好方法。我不認爲它會更快,因爲Python文檔提到'deque'將所有元素添加到新對象中。你對我的第一個答案是正確的,我不應該那麼晚在那麼晚:) – RaphaMex
你可以要麼切片做到這一點:
l2 = [*li[1:], *li[:1]]
for i in l2:
print(i)
這對蟒蛇> = 3.5
工作。對於之前的版本,您可以使用li[1:] + li[:1]
或chain(li[1:],li[:1])
和chain
從itertools
。
另外,使用來自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)
這不會產生額外的名單。
for i in li [1:] + li [:1]:print(i)適用於任何版本的python,並且是IMO最簡單的解決方案。 – Hami
嗯,你可以只使用內置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']
您可以定義自己的發電機功能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
這是怎麼回事?
在列表後追加列表,並且迭代start_index
到start_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)
列表有多大? – Marat