在每次迭代之后寻找一种优雅的方法来“time.sleep()”,除了最后一次迭代

时间:2017-10-05 13:50:15

标签: python python-2.7 python-3.x for-loop

我有一个项目列表:list = [a, b, c, d] 在继续下一次迭代之前,我想修改每个项目然后time.sleep(10)。在最后一次迭代中,我想修改项目,但避免睡觉。

for item in list:  
    # modify item  
    time.sleep(10) # avoid this line on the final iteration  

不一定是这个结构 - 寻找任何完成工作的方法。

6 个答案:

答案 0 :(得分:3)

你可以先睡觉,但是在第一次迭代睡眠时跳过睡眠,而不是:

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

它在最后一个项目中脱落,没有睡觉。

答案 1 :(得分:3)

使用enumerate的另一种解决方案:

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

答案 2 :(得分:2)

您可以使用enumerate来跟踪索引:

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

答案 3 :(得分:2)

如果你反转问题并添加一个布尔值来表示第一个元素,你可以这样做:

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  

答案 4 :(得分: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)):
    ...

答案 5 :(得分:1)

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