《使用python的列表解析以及函数式计算来简化代码》由会员分享,可在线阅读,更多相关《使用python的列表解析以及函数式计算来简化代码(6页珍藏版)》请在金锄头文库上搜索。
1、使用使用 python 的列表解析以及函数式计算来简化代码的列表解析以及函数式计算来简化代码在我们的代码里经常会和列表,元组,字典等数据结构打交道,可以这么说,在很大程度上我们的代码就是对这些数据结构进行处理的过程,在 Python 中对列表,元组,字典等内置的数据结构的处理是很方便的事情,python 借鉴了 Lisp 中的很多函数式计算的方法来处理列表,可以极大的简化我们的代码。set() 将元组,列表 转化成没有重复项的集合list()将集合,元组转化成列表tuple()将集合,列表转化成元组列表解析:返回值 for 元素 in 列表 if 条件 比如 num for num in xr
2、ange(100) if num%2=0 返回 099 之间的偶数列表map(func,list):将 list 的每一个元素传递给 func 的函数,这个函数有一个参数,且返回一个值,map 将每一次调用函数返回的值组成一个新列表返回filter(func,list):将 list 的每一个元素传递给 func 的函数,这个函数有一个参数,返回 bool 类型的值,filter 将返回 True 的元素组成新列表返回reduce(func,list):将 list 的元素,挨个取出来和下一个元素通过func 计算后将结果和再下一个元素继续计算,比如ls=1,3,5,7reduce(lambd
3、a 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(set(ls)2.假如有列表:books=“name“:“C#从入门到精通“,“price“:23.7,“store“:“卓越“,“name“:“ASP.NET 高级编程“,“price“:44.5,“store“:“卓越“,“name“:“C#从入门到精通“,“price“:24.7,“store“:“
4、当当“,“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 if bname=“ASP.NET 高级编程“,key=lambda b:b.price)“store“过程:先用列表解析取出ASP.NET 高级编程的列表,通过 min函数,比较字典的 pr
5、ice 键获取 price 最小的项2.2 求在新华书店购买两本书一样一本要花的钱:price=sum(bprice for b in books if bstore=“新华书店“)2.3 求列表中有那几本书:booknames=list(set(bname for b in books)2.4 列表里当当的书都打 5 折:books=map(lambda b:dict(name=bname,price=bprice*0.5,store=bstore),books)2.5 C#从入门到精通的平均价格:avg=(lambda ls:sum(ls)/len(ls)(b.price for b in
6、 books if bname=“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 bname=bookname),list(set(bname for b in books)这段代码放在一行比较难看懂,但是格式化一下就很好懂了,构建的过程如下:step1 要求每本书的平均价格,首先要得到共有几本书,方法见2.3,得到去重的书名列表list(set(bname for b in books
7、) #去重后的书名列表step2 要求每一本书的均价,需要将计算均价的函数映射到每一本书上,于是map(#计算均价的函数,list(set(bname for b in books) #去重后的书名列表)step3 加入计算单本书均价的函数,参考 2.5 的方法,由于只用一行,所以用 lambda 来搞定:func=lambda bookname:(lambda ls:sum(ls)/len(ls)(b.price for b in books if bname=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 bname=bookname),list(set(bname for b in books) #去重后的书名列表)从上面的例子我们可以看到,利用 map,reduce,filter,列表解析等函数式的方法我们可以非常方便的对列表进行各种操作,包括对复合类型列表进行汇总计算等复杂操作,而且仅需要很少的代码