2017-01-05 80 views
0

我使用以下代碼計算變化在Python最小造幣:變化計算在Python

def change(am): 
    totalcoins = [] 
    for coin in dstock: 
     while coin[0] <= am and coin[1] > 0: 
      totalcoins.append(coin[0]) 
      am = round(am - coin[0], 2) 
      coin[1] = coin[1] - 1 
    return totalcoins 

dstock是從CSV文件創建的變量。這裏是dstock的打印:我想通了如何更新庫存水平以及如何計算的變化

[[1.0, 100], [0.5, 100], [0.2, 100], [0.1, 100], [0.05, 100], [0.02, 100], [0.01, 100]] 

Explained: [denomination,stock level] -- at present there are 100 of each.

但我不能弄清楚如何,如果沒有產生錯誤足夠的股票來產生變化。

例如:

Stock = [[1.0, 0], [0.5, 0], [0.2, 0], [0.1, 0], [0.05, 0], [0.02, 0], [0.01, 2]] 

change = 0.03 

如果股票<變化 打印(錯誤:沒有足夠的庫存發生變化)

+0

以此開始:'sum(a * b for(a,b)in Stock)' –

+1

對不起,我對此很新。這會做什麼? – JAM

+1

'a * b for a(a,b)in Stock'會將子列表放在一起(1.0 * 0,0.01 * 2等),sum將把這些值加在一起。 –

回答

2

沒有額外的循環。

僅當有足夠更改時才允許修改以適應更新庫存。

def change(am, dstock): 
    totalcoins = [] 
    hstock=dstock[:] #make a copy of dstock 
    for coin in hstock: 
     while coin[0] <= am and coin[1] > 0: 
      totalcoins.append(coin[0]) 
      am = round(am - coin[0], 2) 
      coin[1] = coin[1] - 1 
    if am>0: 
     raise ValueError("not enough stock to produce change") 
    else: 
     dstock = hstock 
     return totalcoins 

dstock = [[1.0, 0], [0.5, 0], [0.2, 0], [0.1, 0], [0.05, 0], [0.02, 0], [0.01, 3]] 


print change(0.03, dstock) #[0.01, 0.01, 0.01] 
print dstock #[[1.0, 0], [0.5, 0], [0.2, 0], [0.1, 0], [0.05, 0], [0.02, 0], [0.01, 0]] 
+0

THANKYOU!這對產生錯誤非常有用,但它不會返回移除的硬幣。硬幣[1] =硬幣[1] - 1仍然完成。無論如何,如果沒有足夠的產品來改變這些產品,那麼是否會將這些產品歸還給我們? – JAM

+0

感謝您補充這一點,它爲我產生了一個錯誤? UnboundLocalError:分配前引用的局部變量'dstock' – JAM

1

你的問題是相當模糊的,但我認爲你是問如何產生一個錯誤。如果不是,請詳細

使用異常和條件:

if stock < stock_required_for_change: 
    raise Exception("Not enough Stock to produce change") 
+0

謝謝。每個硬幣的庫存水平爲0.01,庫存水平爲2.如果計算所需的更改爲0.03,則沒有足夠的庫存0.01來提供更改,因此必須產生錯誤。那有意義嗎? – JAM

+0

@JAM你是問如何提出一個例外,或者如何確定一個給定的股票是否可以做出某個變化值?如果是後者,那不是一個真正的編程問題,並且在這裏有點超出範圍。 – glibdud