WEB开发网
开发学院软件开发Python 使用python的列表解析以及函数式计算来简化代码 阅读

使用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"]过程:

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,列表解析等函数式的方法我们可以非常方便的对列表进行各种操作,包括对复合类型列表进行汇总计算等复杂操作,而且仅需要很少的代码

上一页  1 2 

Tags:使用 python 列表

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接