使用python的列表解析以及函数式计算来简化代码
2010-08-19 00:00:00 来源:WEB开发网2.1 求《ASP.NET高级编程》价格最便宜的店:
storename=min([b for b in books if b['name']=="ASP.NET高级编程"],key=lambda b:b.price)["store"]
过程:先用列表解析取出《ASP.NET高级编程》的列表,通过min函数,比较字典的price键获取price最小的项
2.2 求在新华书店购买两本书一样一本要花的钱:
price=sum([b['price'] for b in books if b['store']=="新华书店"])
2.3 求列表中有那几本书:
booknames=list(set([b['name'] for b in books]))
2.4 列表里当当的书都打5折:
books=map(lambda b:dict(name=b['name'],price=b['price']*0.5,store=b['store']),books)
2.5 《C#从入门到精通》的平均价格:
avg=(lambda ls:sum(ls)/len(ls))([b.price for b in books if b['name']=="C#从入门到精通"])
2.6 求每本书的平均价格:
book_avg=map(lambda bookname:dict(name=bookname,avg=(lambda ls:sum(ls)/len(ls))([b.price for b in books if b['name']==bookname])),list(set([b['name'] for b in books])))
这段代码放在一行比较难看懂,但是格式化一下就很好懂了,构建的过程如下:
step1 要求每本书的平均价格,首先要得到共有几本书,方法见2.3,得到去重的书名列表
list(set([b['name'] for b in books])) #去重后的书名列表
step2 要求每一本书的均价,需要将计算均价的函数映射到每一本书上,于是
map(
#计算均价的函数,
list(set([b['name'] for b in books])) #去重后的书名列表
)
step3 加入计算单本书均价的函数,参考2.5的方法,由于只用一行,所以用lambda来搞定:
func=lambda bookname:(lambda ls:sum(ls)/len(ls))([b.price for b in books if b['name']==bookname])
step4 将计算单本均价的lambda函数加入map中,得到最终结果:
经过格式化后的结果,前面的单行代码可以格式化为下面容易阅读的形式
map(
lambda bookname:reduce(
lambda bookname:
dict(
name=bookname,
avg=(lambda ls:sum(ls)/len(ls))([b.price for b in books if b['name']==bookname])
),
list(
set(
[b['name'] for b in books]
)
) #去重后的书名列表
)
从上面的例子我们可以看到,利用map,reduce,filter,列表解析等函数式的方法我们可以非常方便的对列表进行各种操作,包括对复合类型列表进行汇总计算等复杂操作,而且仅需要很少的代码
更多精彩
赞助商链接