2014-03-01 50 views
1

我可以迭代同時彈出嗎?爲什麼它會跳過我列表中的某個值?

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

迭代時,您無法安全地從列表中刪除項目。 – BrenBarn

+0

@BrenBarn爲什麼它不適用於凱文?我正在刪除該項目,因爲shipments_list最後需要爲空[] ... – user3362071

+0

plz刪除此重複問題@AshwiniChaudhary – user3362071

回答

0

您正在修改shipments_list的迭代循環。不要這樣做,因爲循環索引出錯。

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!所以它也是35

+0

我只做了兩件事:我刪除了'shipments_list.remove(order)',並添加了' del shipments_list [:]'。我沒有(故意)改變別的。 – mhlester

相關問題