我可以在同时弹出的同时进行迭代吗?
def process_shipments(shipments_list):
next_day_orders = []
bamboo_shoots = 20
bamboo_leaves = 15
for order in shipments_list:
if order[1] < 20 and order[2] < 15 and bamboo_shoots > 0 and bamboo_leaves > 0:
bamboo_shoots -= order[1]
bamboo_leaves -= order[2]
total_cost = ((5*order[1])+(2*order[2]))
print (order[0], "-", "$",total_cost)
else:
next_day_orders += order
shipments_delete[:]
return next_day_orders
我在问这两个版本是否可行。我正在努力优化效率。
答案 0 :(得分:0)
您正在循环迭代它的循环中修改shipments_list
。不要这样做,因为循环索引会出错。
答案 1 :(得分:0)
您正在迭代过程中从列表中删除项目。这几乎总能给你带来奇怪的结果。根据您的评论,您只希望shipments_list
在结尾处为空,所以在结束时而不是在循环中间执行此操作:
for order in shipments_list:
if order[1] <= 20 and order[2] <= 15 and bamboo_shoots >= 0 and bamboo_leaves >= 0:
bamboo_shoots -= order[1]
bamboo_leaves -= order[2]
total_cost = ((5*order[1])+(2*order[2]))
print (order[0], "-", "$",total_cost)
else:
next_day_orders += order
del shipments_list[:] # <-- empty the list here
return next_day_orders
为什么不想从循环列表中删除项目?考虑这个例子:
>>> x = [0, 1, 2, 3, 4, 5]
>>> for y in x:
... print y
... x.remove(y)
...
0
2
4
>>>
只迭代偶数元素。第一个元素是0
。但是在该循环中,0
被删除了,所以现在第一个元素是1
。下一个循环跳到第二个元素,现在是2
。 1
从未被处理过!因此,它也适用于3
和5
。