python⽥字格函数简化代码_使⽤python的列表解析以及函数
式计算来简化代码
在我们的代码⾥经常会和列表,元组,字典等数据结构打交道,可以这么说,在很⼤程度上我们的代码就是对这些数据结构进⾏处理的过程,在Python中对列表,元组,字典等内置的数据结构的处理是很⽅便的事情,python借鉴了Lisp中的很多函数式计算的⽅法来处理列表,可以极⼤的简化我们的代码。
set() 将元组,列表 转化成没有重复项的集合
list()将集合,元组转化成列表
tuple()将集合,列表转化成元组
列表解析:[返回值 for 元素 in 列表 if 条件] ⽐如 [num for num in xrange(100) if num%2==0] 返回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(set(ls))python新手代码及作用
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 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,列表解析等函数式的⽅法我们可以⾮常⽅便的对列表进⾏各种操作,包括对复合类型列表进⾏汇总计算等复杂操作,⽽且仅需要很少的代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。