日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用 Python 來解決慈善機(jī)構(gòu)的業(yè)務(wù)問題

比較不同的編程語言如何解決同一個(gè)問題是一個(gè)很有趣的事情,也很有指導(dǎo)意義。接下來,我們就來講一講如何用 Python 來解決。

在我這一系列的 第一篇文章 里,我描述了這樣子的一個(gè)問題,如何將一大批的救助物資分為具有相同價(jià)值的物品,并將其分發(fā)給社區(qū)中的困難住戶。我也曾寫過用不同的編程語言寫一些小程序來解決這樣子的小問題以及比較這些程序時(shí)如何工作的。

在第一篇文章中,我是使用了 Groovy 語言來解決問題的。Groovy 在很多方面都與 Python 很相似,但是在語法上她更像 C 語言和 Java。因此,使用 Python 來創(chuàng)造一個(gè)相同的解決方案應(yīng)該會(huì)很有趣且更有意義。

使用 Python 的解決方案

使用 Java 時(shí),我會(huì)聲明一個(gè)工具類來保存元組數(shù)據(jù)(新的記錄功能將會(huì)很好地用于這個(gè)需求)。使用 Groovy 時(shí),我就是用了該語言的映射功能,我也將在 Python 使用相同的機(jī)制。

使用一個(gè)字典列表來保存從批發(fā)商處批發(fā)來的貨物:

 
 
 
 
  1. packs = [
  2. {'item':'Rice','brand':'Best Family','units':10,'price':5650,'quantity':1},
  3. {'item':'Spaghetti','brand':'Best Family','units':1,'price':327,'quantity':10},
  4. {'item':'Sardines','brand':'Fresh Caught','units':3,'price':2727,'quantity':3},
  5. {'item':'Chickpeas','brand':'Southern Style','units':2,'price':2600,'quantity':5},
  6. {'item':'Lentils','brand':'Southern Style','units':2,'price':2378,'quantity':5},
  7. {'item':'Vegetable oil','brand':'Crafco','units':12,'price':10020,'quantity':1},
  8. {'item':'UHT milk','brand':'Atlantic','units':6,'price':4560,'quantity':2},
  9. {'item':'Flour','brand':'Neighbor Mills','units':10,'price':5200,'quantity':1},
  10. {'item':'Tomato sauce','brand':'Best Family','units':1,'price':190,'quantity':10},
  11. {'item':'Sugar','brand':'Good Price','units':1,'price':565,'quantity':10},
  12. {'item':'Tea','brand':'Superior','units':5,'price':2720,'quantity':2},
  13. {'item':'Coffee','brand':'Colombia Select','units':2,'price':4180,'quantity':5},
  14. {'item':'Tofu','brand':'Gourmet Choice','units':1,'price':1580,'quantity':10},
  15. {'item':'Bleach','brand':'Blanchite','units':5,'price':3550,'quantity':2},
  16. {'item':'Soap','brand':'Sunny Day','units':6,'price':1794,'quantity':2}]

大米有一包,每包中有 10 袋大米,意大利面條有十包,每包中有一袋意大利面條。上述代碼中,變量 packs 被設(shè)置為 Python 字典列表。這與 Groovy 的方法非常相似。關(guān)于 Groovy 和 Python 之間的區(qū)別,有幾點(diǎn)需要注意:

  1. 在 Python 中,無需關(guān)鍵字來定義變量 packs,Python 變量初始化時(shí)需要設(shè)置一個(gè)值。
  2. Python 字典中的詞鍵(例如,item、brand、units、price、 quantity)需要引號(hào)來表明它們是字符串;Groovy 假定這些是字符串,但也接受引號(hào)。
  3. 在 Python 中,符號(hào) { ... } 表明一個(gè)字典聲明; Groovy 使用與列表相同的方括號(hào),但兩種情況下的結(jié)構(gòu)都必須具有鍵值對(duì)。

當(dāng)然,表中的價(jià)格不是以美元計(jì)算的。

接下來,打開散裝包。例如,打開大米的單個(gè)散裝包裝,將產(chǎn)出 10 單元大米; 也就是說,產(chǎn)出的單元總數(shù)是 units * quantity。 Groovy 腳本使用一個(gè)名為 collectMany 的方便的函數(shù),該函數(shù)可用于展平列表列表。 據(jù)我所知,Python 沒有類似的東西,所以使用兩個(gè)列表推導(dǎo)式來產(chǎn)生相同的結(jié)果:

 
 
 
 
  1. units = [[{'item':pack['item'],'brand':pack['brand'],
  2. 'price':(pack['price'] / pack['units'])}] *
  3. (pack['units'] * pack['quantity']) for pack in packs]
  4. units = [x for sublist in units for x in sublist]

第一個(gè)列表可理解為(分配給單元)構(gòu)建字典列表列表。 第二個(gè)將其“扁平化”為字典列表。 請(qǐng)注意,Python 和 Groovy 都提供了一個(gè) * 運(yùn)算符,它接受左側(cè)的列表和右側(cè)的數(shù)字 N,并復(fù)制列表 N 次。

最后一步是將這些單元的大米之類的重新包裝到籃子(hamper)中以進(jìn)行分發(fā)。 就像在 Groovy 版本中一樣,你需要更具體地了解理想的籃子數(shù),當(dāng)你只剩下幾個(gè)單元時(shí),你最好不要過度限制,即可以做一些隨機(jī)分配:

 
 
 
 
  1. valueIdeal = 5000
  2. valueMax = valueIdeal * 1.1

很好! 重新打包籃子。

 
 
 
 
  1. import random
  2. hamperNumber = 0 # 導(dǎo)入 Python 的隨機(jī)數(shù)生成器工具并初始化籃子數(shù)
  3. while len(units) > 0: # 只要有更多可用的單元,這個(gè) `while` 循環(huán)就會(huì)將單元重新分配到籃子中:
  4. hamperNumber += 1
  5. hamper = []
  6. value = 0
  7. canAdd = True # 增加籃子編號(hào),得到一個(gè)新的空籃子(單元的列表),并將其值設(shè)為 0; 開始假設(shè)你可以向籃子中添加更多物品。
  8. while canAdd: # 這個(gè) `while` 循環(huán)將盡可能多地向籃子添加單元(Groovy 代碼使用了 `for` 循環(huán),但 Python 的 `for` 循環(huán)期望迭代某些東西,而 Groovy 則是為更傳統(tǒng)的 C 形式的 `for` 循環(huán)形式):
  9. u = random.randint(0,len(units)-1) # 獲取一個(gè)介于 0 和剩余單元數(shù)減 1 之間的隨機(jī)數(shù)。
  10. canAdd = False # 假設(shè)你找不到更多要添加的單元。
  11. o = 0 # 創(chuàng)建一個(gè)變量,用于從你正在尋找要放入籃子中的物品的起點(diǎn)的偏移量。
  12. while o < len(units): # 從隨機(jī)選擇的索引開始,這個(gè) `while` 循環(huán)將嘗試找到一個(gè)可以添加到籃子的單元(再次注意,Python `for` 循環(huán)可能不適合這里,因?yàn)榱斜淼拈L(zhǎng)度將在迭代中中發(fā)生變化)。
  13. uo = (u + o) % len(units)
  14. unit = units[uo]
  15. unitPrice = unit['price'] # 找出要查看的單元(隨機(jī)起點(diǎn)+偏移量)并獲得其價(jià)格。
  16. if len(units) < 3 or not (unit in hamper) and (value + unitPrice) < valueMax:
  17. # 如果只剩下幾個(gè),或者添加單元后籃子的價(jià)值不太高,你可以將此單元添加到籃子中。
  18. hamper.append(unit)
  19. value += unitPrice
  20. units.pop(u) # 將單元添加到籃子中,按單價(jià)增加 籃子數(shù),從可用單元列表中刪除該單元。
  21. canAdd = len(units) > 0
  22. break # 只要還有剩余單元,你就可以添加更多單元,因此可以跳出此循環(huán)繼續(xù)尋找。
  23. o += 1 # 增加偏移量。
  24. # 在退出這個(gè) `while` 循環(huán)時(shí),如果你檢查了所有剩余的單元并且找不到單元可以添加到籃子中,那么籃子就完成了搜索; 否則,你找到了一個(gè),可以繼續(xù)尋找更多。
  25. print('')
  26. print('Hamper',hamperNumber,'value',value)
  27. for item in hamper:
  28. print('%-25s%-25s%7.2f' % (item['item'],item['brand'],item['price'])) # 打印出籃子的內(nèi)容。
  29. print('Remaining units',len(units)) # 打印出剩余的單元信息。

一些澄清如上面的注釋。

運(yùn)行此代碼時(shí),輸出看起來與 Groovy 程序的輸出非常相似:

 
 
 
 
  1. Hamper 1 value 5304.0
  2. UHT milk Atlantic 760.00
  3. Tomato sauce Best Family 190.00
  4. Rice Best Family 565.00
  5. Coffee Colombia Select 2090.00
  6. Sugar Good Price 565.00
  7. Vegetable oil Crafco 835.00
  8. Soap Sunny Day 299.00
  9. Remaining units 148
  10.  
  11. Hamper 2 value 5428.0
  12. Tea Superior 544.00
  13. Lentils Southern Style 1189.00
  14. Flour Neighbor Mills 520.00
  15. Tofu Gourmet Choice 1580.00
  16. Vegetable oil Crafco 835.00
  17. UHT milk Atlantic 760.00
  18. Remaining units 142
  19.  
  20. Hamper 3 value 5424.0
  21. Soap Sunny Day 299.00
  22. Chickpeas Southern Style 1300.00
  23. Sardines Fresh Caught 909.00
  24. Rice Best Family 565.00
  25. Vegetable oil Crafco 835.00
  26. Spaghetti Best Family 327.00
  27. Lentils Southern Style 1189.00
  28. Remaining units 135
  29.  
  30. ...
  31.  
  32. Hamper 21 value 5145.0
  33. Tomato sauce Best Family 190.00
  34. Tea Superior 544.00
  35. Chickpeas Southern Style 1300.00
  36. Spaghetti Best Family 327.00
  37. UHT milk Atlantic 760.00
  38. Vegetable oil Crafco 835.00
  39. Lentils Southern Style 1189.00
  40. Remaining units 4
  41.  
  42. Hamper 22 value 2874.0
  43. Sardines Fresh Caught 909.00
  44. Vegetable oil Crafco 835.00
  45. Rice Best Family 565.00
  46. Rice Best Family 565.00
  47. Remaining units 0

最后一個(gè)籃子在內(nèi)容和價(jià)值上有所簡(jiǎn)化。

結(jié)論

乍一看,這個(gè)程序的 Python 和 Groovy 版本之間沒有太大區(qū)別。 兩者都有一組相似的結(jié)構(gòu),這使得處理列表和字典非常簡(jiǎn)單。 兩者都不需要很多“樣板代碼”或其他“繁雜”操作。

此外,使用 Groovy 時(shí),向籃子中添加單元還是一件比較繁瑣的事情。 你需要在單元列表中隨機(jī)選擇一個(gè)位置,然后從該位置開始,遍歷列表,直到找到一個(gè)價(jià)格允許的且包含它的單元,或者直到你用完列表為止。 當(dāng)只剩下幾件物品時(shí),你需要將它們?nèi)拥阶詈笠粋€(gè)籃子里。

另一個(gè)值得一提的問題是:這不是一種特別有效的方法。 從列表中刪除元素、極其多的重復(fù)表達(dá)式還有一些其它的問題使得這不太適合解決這種大數(shù)據(jù)重新分配問題。 盡管如此,它仍然在我的老機(jī)器上運(yùn)行。

如果你覺得我在這段代碼中使用 while 循環(huán)并改變其中的數(shù)據(jù)感到不舒服,你可能希望我讓它更有用一些。 我想不出一種方法不使用 Python 中的 map 和 reduce 函數(shù),并結(jié)合隨機(jī)選擇的單元進(jìn)行重新打包。 你可以嗎?

在下一篇文章中,我將使用 Java 重新執(zhí)行此操作,以了解 Groovy 和 Python 的工作量減少了多少,未來的文章將介紹 Julia 和 Go。


當(dāng)前標(biāo)題:使用 Python 來解決慈善機(jī)構(gòu)的業(yè)務(wù)問題
標(biāo)題URL:http://www.dlmjj.cn/article/djeddih.html