为什么它在我的列表中跳过某个值?

时间:2014-03-01 05:37:26

标签: python list

我可以在同时弹出的同时进行迭代吗?

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

我在问这两个版本是否可行。我正在努力优化效率。

2 个答案:

答案 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。下一个循环跳到第二个元素,现在是21从未被处理过!因此,它也适用于35