比较不同的编程语言如何解决同一个问题很有趣也很有启发意义。接下来说说如何使用Python来解决。在本系列的第一篇文章中,我描述了一个问题,比如如何将一大笔救灾物资分成等值的物品,分发给社区中的困难户。我也用不同的编程语言编写过小程序来解决像这样的小问题以及比较这些程序是如何工作的。在第一篇文章中,我使用了Groovy语言来解决问题。Groovy在很多方面与Python相似,但在语法上它更像C和Java。因此,使用Python创建一个等效的解决方案应该很有趣并且更有意义。虽然Python中的解决方案使用的是Java,但我会声明一个实用程序类来保存元组数据(新的日志记录功能将很好地满足这一要求)。在使用Groovy时,我使用了该语言的映射功能,我将在Python中使用相同的机制。使用字典列表保存批发商的批发商品:packs=[{'item':'Rice','brand':'BestFamily','units':10,'price':5650,'quantity':1},{'item':'Spaghetti','brand':'BestFamily','units':1,'price':327,'quantity':10},{'item':'沙丁鱼','brand':'FreshCaught','units':3,'price':2727,'quantity':3},{'item':'Chickpeas','brand':'SouthernStyle','units':2,'price':2600,'quantity':5},{'item':'Lentils','brand':'SouthernStyle','units':2,'price':2378,'quantity':5},{'item':'植物油','brand':'Crafco','units':12,'price':10020,'quantity':1},{'item':'UHT牛奶','brand':'Atlantic','units':6,'price':4560,'quantity':2},{'item':'Flour','brand':'NeighborMills','units':10,'price':5200,'quantity':1},{'item':'番茄酱','brand':'BestFamily','units':1,'price':190,'quantity':10},{'item':'Sugar','brand':'GoodPrice','units':1,'price':565,'quantity':10},{'item':'Tea','brand':'高级','单位':5,'价格':2720,'quantity':2},{'item':'Coffee','brand':'ColombiaSelect','units':2,'price':4180,'quantity':5},{'item':'Tofu','brand':'GourmetChoice','units':1,'price':1580,'quantity':10},{'item':'Bleach','brand':'Blanchite','units':5,'price':3550,'quantity':2},{'item':'Soap','brand':'SunnyDay','units':6,'price':1794,'quantity':2}]一包大米,每包10袋米,十包意大利面,每包一袋意大利面在上面的代码中,变量packs被设置为Python字典列表。这与Groovy的方法非常相似。关于Groovy和Python之间的区别需要注意的几点:在Python中,变量packs是在没有关键字的情况下定义的,并且Python变量需要使用值进行初始化。Python字典中的键(例如,item、brand、units、price、quantity)需要引号来表明它们是字符串;Groovy假定这些是字符串,但也接受引号。在Python中,符号{...}表示字典声明;Groovy使用与列表相同的方括号,但在这两种情况下,结构都必须具有键值对。当然,表中的价格不是美元。接下来,打开大包装。例如,打开单个散装大米将产生10个单位的大米;也就是说,生产的总单位数是单位数*数量。Groovy脚本使用一个名为collectMany的便捷函数,该函数可用于展平列表的列表。据我所知,Python没有类似的东西,所以使用两个列表理解来产生相同的结果:units=[[{'item':pack['item'],'brand':pack['brand'],'price':(pack['price']/pack['units'])}]*(pack['units']*pack['quantity'])forpackinpacks]units=[xforsublistinunitsforxinsublist]第一个列表可以理解为(assignedtounits)构建字典列表的列表。第二个将其“扁平化”为字典列表。请注意,Python和Groovy都提供了一个*运算符,它接受左侧的列表和右侧的数字N,并将列表复制N次。最后一步是将这些单位的大米等重新包装到篮子(篮子)中进行分发。就像在Groovy版本中一样,您需要更具体地确定理想的篮子数量,当您只剩下几个单元格时,最好不要过度限制,即您可以进行一些随机分配:valueIdeal=5000valueMax=valueIdeal*1.1非常好!重新包装篮子。importrandomhamperNumber=0#导入Python的随机数生成器工具并初始化篮子的数量whilelen(units)>0:#这个`while`循环会在有更多单位可用时将单位重新分配给篮子:hamperNumber+=1hamper=[]value=0canAdd=True#递增篮子编号,得到一个新的空篮子(单元格列表),并将其值设置为0;开始假设您可以向购物篮中添加更多商品。whilecanAdd:#这个`while`循环会把尽可能多的单元格添加到篮子里(Groovy代码使用一个`for`循环,但是Python的`for`循环需要迭代一些东西,而Groovy是为更传统的C`for`循环形式):u=random.randint(0,len(units)-1)#得到一个介于0和剩余单元数减1之间的随机数。canAdd=False#假设你不能找到要添加的更多单元。o=0#创建一个变量,用于从您正在寻找要放入购物车的商品的位置开始的偏移量。whileo
