2017-10-05 81 views

回答

3

+0

如果我的理解正確,你傳遞-3作爲枚舉的開始索引,迭代:-3,-2,-1,0,並將0用作False用於if語句? – Homer

+0

@Simonsays是的,這是正確的。 Zero是False-ish,非零數字是Python中的True-ish。 –

2

您可以使用enumerate跟蹤指數:

for index, data in enumerate(list, 1 - len(list)): 
    if index: 
     time.sleep(10) 
+0

** 1 **您可以將'enumerate'傳遞給一個起始值。 ** 2 **爲什麼要計算每次循環迭代的列表長度?它不會改變(至少,我認爲它不會改變,因爲改變列表的長度通常並不明智,除非你非常小心)。當然,獲得列表長度是一個非常快速的操作,但仍然... –

+0

@ PM2Ring啊,謝謝你指出,我應該使用'枚舉(列表,1 - len(列表))' –

+0

但這正是你寫了@ PM2Ring。順便說一句,感謝提出2點(他們真的很有幫助)一個學習對我來說 –

3

你可以睡第一,但跳過睡眠的第一次迭代的睡眠,而不是:

for idx, item in enumerate(list): 
    if idx != 0: 
     time.sleep(10) # avoid this line on the final iteration 
    # modify item 

它脫落在最後一個項目,不睡眠。另一種解決方案使用enumerate

do_sleep = False 
for item in list: 
    if do_sleep: 
     time.sleep(10) # avoid this line on the first iteration. 
    else: 
     do_sleep = True 
    # modify item 
2

如果逆問題,並添加一個布爾信號的第一個元素,你可以做到這一點

lst = ['a', 'b', 'c', 'd'] 
for i, v in enumerate(lst, 1 - len(lst)): 
    print(v) 
    if i: 
     print('sleeping') 

輸出

a 
sleeping 
b 
sleeping 
c 
sleeping 
d 
+0

斑點!感謝,修復。 –

1
for i,item in enumerate(list): 
    # modify item 
    if i < len(list) - 1: 
     time.sleep(10) 
2

如果您想避免在每次迭代中測試最後一個元素。

for element in elements[:-1]: 
    process_element(element) 
    time.sleep(10) 

process_element(element) 

如果需要將更改應用於列表中的元素(不創建新列表)。

for index, _ in enumerate(elements[:-1]): 
    process_element(elements, index) 
    time.sleep(10) 

process_element(elements, -1) 

def process_element(elements, index): 
    elements[index] += 1 

如果你想避免複製列表,你可以使用islice。請注意,len([])具有O(1)成本。

for element in islice(elements, len(elements) - 1): 
    ... 

for index, _ in enumerate(islice(elements, len(elements) - 1)): 
    ... 
+0

這不會完全跳過修改最後一項嗎? – Homer

+1

[islice](https://docs.python.org/3/library/itertools.html#itertools.islice)方法可以處理參考副本。 – noxdafox

+0

@Simonsays最後一項在循環之外處理。 –