为了账号安全,请及时绑定邮箱和手机立即绑定

遍历列表并多次删除其元素

遍历列表并多次删除其元素

四季花海 2022-10-06 16:18:17
我在 Python 中有以下脚本,每 30 秒检查一次列表中的所有任务,当任务完成(失败、取消或完成)时,该任务将从原始任务中删除,然后再次跟踪其他任务。代码以这种方式运行良好。问题是我不确定while循环的每次迭代是否都在创建一个新列表,因为整个过程可能需要几个小时,所以我不想在内存中创建不必要的数据。def download():    while tasks:        for task in tasks[:]:            success = 0            file_name = task[1]            task_index = tasks.index(task)            task_state = ee.data.getTaskStatus(task[0])[0]['state']            print(task, task_state)            if  task_state == FAILED:                tasks.remove(tasks[task_index])            elif task_state in [CANCEL_REQUESTED, CANCELLED]:                tasks.remove(tasks[task_index])            elif task_state == COMPLETED:                tasks.remove(tasks[task_index])                success = 1            if success == 1:                do_something()        if tasks:            time.sleep(30)        else:            print('Done!')download()
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

您显示的代码没有创建另一个列表,您也可以改进一下:


to_remove_states = {CANCEL_REQUESTED, CANCELLED, FAILED, COMPLETED}


def my_filter(taks):

    state = ee.data.getTaskStatus(task[0])[0]['state']

    if state in to_remove_states:

        if state == COMPLETED:

            do_something()   # should not be dependent on your tasks form download function

        return False

    return True


def download():

    while tasks:

        time.sleep(30)

        tasks  = list(filter(my_filter, tasks))

    print('Done!')


download()


查看完整回答
反对 回复 2022-10-06
?
HUH函数

TA贡献1836条经验 获得超4个赞

您的代码中没有创建新列表。但你可能想缩短一点:


def download():

while tasks:


    for task in tasks[:]:

        success = 0

        file_name = task[1]

        task_index = tasks.index(task)

        task_state = ee.data.getTaskStatus(task[0])[0]['state']


        print(task, task_state)


        if task_state in [CANCEL_REQUESTED, CANCELLED, FAILED, COMPLETED]:

            tasks.remove(tasks[task_index])

        if task_state == COMPLETED:

            do_something()


    if tasks:

        time.sleep(30)

    else:

        print('Done!')

download()

我认为这段代码很好用;)


查看完整回答
反对 回复 2022-10-06
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信