使用python的列表解析以及函数式计算来简化代码

  在我们代码里经常会和列表元组字典等数据结构打交道可以这么说在很大程度上我们代码就是对这些数据结构进行处理过程在 Python中对列表元组字典等内置数据结构处理是很方便事情python借鉴了Lisp中很多式计算思路方法来处理列表可以极大简化我们代码

   将元组列表 转化成没有重复项集合

  list将集合元组转化成列表

  tuple将集合列表转化成元组

  列表解析:[返回值 for 元素 in 列表 条件] 比如 [num for num in xrange(100) num%20] 返回0~99的间偶数列表

  map(func,list):将list个元素传递给func这个个参数且返回个值map将每返回值组成个新列表返回

  filter(func,list):将list个元素传递给func这个个参数返回bool类型filter将返回True元素组成新列表返回

  reduce(func,list):将list元素挨个取出来和下个元素通过func计算后将结果和再下个元素继续计算比如

  ls=[1,3,5,7]

  reduce(lambda x,y:x+y,ls)

  计算过程就是 1+3=4 然后4+5得到结果9再加7以此类推最后返回最终计算结果

  下面我们用实际例子来看如何运用这几个

  1.列表去重

  如果有个列表ls=[1,3,2,5,2,1,3,4,6]需要去掉其中重复如何做?

  最简单办法   ls=list((ls))

  2.假如有列表:

books=[
        {"name":"C#从入门到精通","price":23.7"store":"卓越"},
        {"name":"ASP.NET高级编程","price":44.5"store":"卓越"}
        {"name":"C#从入门到精通","price":24.7,"store":"当当"},
        {"name":"ASP.NET高级编程","price":45.7,"store":"当当"},
        {"name":"C#从入门到精通","price":26.7,"store":"新华书店"},
        {"name":"ASP.NET高级编程","price":55.7,"store":"新华书店"},
      ]


  2.1 求ASP.NET高级编程价格最便宜店:

  storename=min([b for b in books 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 b['store']"新华书店"])

  2.3 求列表中有那几本书:

  booknames=list(([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 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 b['name']bookname])),list(([b['name'] for b in books])))

  这段代码放在行比较难看懂但是格式化下就很好懂了构建过程如下:

  step1 要求每本书平均价格首先要得到共有几本书思路方法见2.3得到去重书名列表

  list(([b['name'] for b in books])) #去重后书名列表

  step2 要求每本书均价需要将计算均价映射到每本书上于是

map(
    #计算均价
    list(([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 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  b['name']bookname])
        )
    list(
         (
             [b['name'] for b in books]
         )
    ) #去重后书名列表
)


  从上面例子我们可以看到利用map,reduce,filter,列表解析等思路方法我们可以非常方便对列表进行各种操作包括对复合类型列表进行汇总计算等复杂操作而且仅需要很少代码



Tags: 

延伸阅读

最新评论

发表评论