For循环不会弹出列表中的最后一个剩余项目

时间:2018-01-27 01:08:22

标签: python python-3.x list pop

(请注意,虽然这被标记为一个不同问题的副本,但我没有看到我的问题,更不用说那个答案了。我意识到,在某种程度上,他们可能是同样的问题,因为版主选择了但是,对于没有那种深度理解的所有用户,因此不得不提出这个问题,我认为我的问题和给出的答案更加平易近人。)

这是一个学习问题 - 只是试图了解列表中的pop和for循环。这似乎是基本的,以前必须得到回答,但我不能寻找正确的事情。

我做了一个与项目和没有项目的ta da列表。然后我的for循环应该从待办事项列表中弹出每个项目并将其附加到ta da列表。但是,即使我的列表有三个项目,也只有两个会弹出并追加。

以下是代码:

to_do_list=['buttons','drawers','call mom']
ta_da_list=[]
print("To do: "+str(len(to_do_list))+" items")
print("Done: "+str(len(ta_da_list))+" items")
for item in to_do_list:
    done=to_do_list.pop()
    ta_da_list.append(done)
    print("Woo hoo! "+done.title()+ " is done!")
print("Look at all I did today! \n\t"+str(ta_da_list))
print("I still have this to do: \n\t"+str(to_do_list))
print("To do: "+str(len(to_do_list))+" items")
print("Done: "+str(len(ta_da_list))+" items")
done=to_do_list.pop() #testing that I can pop the last item when it's not in 
     a for loop
print(done) #yup, it popped

这是输出:

To do: 3 items
Done: 0 items
Woo hoo! Call Mom is done!
Woo hoo! Drawers is done!
Look at all I did today!
        ['call mom', 'drawers']
I still have this to do:
        ['buttons']
To do: 1 items
Done: 2 items
buttons

我预计还有1个" Woo hoo",一个空的to_do_list和ta_da_list中的3个项目。为什么for循环在处理列表中的最后一项之前就停止了?

在Windows上运行Python 3.

1 个答案:

答案 0 :(得分:3)

当您使用for item in to_do_list:对列表进行迭代时,您不应该修改列表。见strange result when removing item from a list

相反,您可以使用while循环:

while to_do_list:
    done = to_do_list.pop()
    ta_da_list.append(done)
    print("Woo hoo! "+done.title()+ " is done!")

或者您可以使用range()循环。

for _ in range(len(to_do_list)):
    done = to_do_list.pop()
    ta_da_list.append(done)
    print("Woo hoo! "+done.title()+ " is done!")

这决定了循环首次启动时范围的限制,因此对len(to_do_list)的更改不会影响循环。