Python进阶(九)常⽤⾼级函数Counter、defaultdict、nametupl。。。
⽂章⽬录
使⽤⾼级函数在很多时候会减少⾃⼰的代码开发。
Counter计数器
Counter是⼀个简单的计数器,例如统计字符出现的个数。Counter类继承dict类,所以它能使⽤dict类⾥⾯的⽅法。
1. 对iterable进⾏计数
使⽤Counter可以很⽅便地统计出每个元素出现的次数:
上述实现当然可以使⽤dict或者for循环来实现,但是使⽤Counter会更⽅便⼀点。
2. update往Counter新增内容
使⽤update可以往Counter新增内容
3. 像字典⼀样输出key/value
可以像字典⼀样,遍历输出key/value:
4. 输出最⾼频率的数据
除此之外还有⼀个功能,很⽅便的输出最⾼频率的数据,⽐如到出现次数最⾼的前三个的内容:
defaultdict
使⽤dict时,如果引⽤的key不存在,就会抛出KeyError。如果希望key不存在时,返回⼀个默认值,就可以⽤defaultdict。它是⼀个带默认值的字典。当然你也可以使⽤以下语句来对字典初始化:
if key not in d:
d[key]=0
d[key]=[]
d[key]+=3
d[key].append(123)
除了在Key不存在时返回默认值,defaultdict的其他⾏为跟dict是完全⼀样的。defaultdict的语法为:
语法:dict =defaultdict(factory_function)
factory_function可以是str、int、list、set,可以省略初始化。
1. 默认的value为int类型
默认的value为int类型,直接加数字:
2. 设置value为None
import collections
x = collections.defaultdict(lambda:'N/A')
x['key1']='abc'
print(x['key1'])# >>> abc
print(x['key2'])# >>> N/A
3. 默认的value为list类型
默认的value为list类型,直接添加元素:
namedtuple
collections.namedtuple(typename, field_ names,*, verbose=False,
rename=False, module=None)
namedtuple是⼀个函数,它⽤来创建⼀个⾃定义的tuple对象,并且规定了tuple元素的个数,并可以⽤属性⽽不是索引来引⽤tuple的某个元素。
这样⼀来,我们⽤nametuple可以很⽅便地定义⼀种数据类型,它具备tuple的不变性,⼜可以根据属性来引⽤。
import collections
Point = collections.namedtuple('Point',['x','y'])
P = Point(1,2)
print(P.x)# >>> 1
print(P.y)# >>> 2
PP = Point(x=3, y=4)
print(PP.x)## >>> 3
print(PP.y)## >>> 4
namedtuple的属性值不能更改,否者会报错。⽐如设置PP.x=10这样的语句就会报错。
map、reduce、filter函数
map、reduce、filter是针对序列操作的函数。
map
map(function, iterable, ...)给序列的每个元素应⽤⼀个函数,返回⼀个迭代器。
map返回的并不是⼀个真正的list,⽽是⼀个可遍历的对象。想要看起内容的话,可以使⽤list将函数其转化为⼀个list。reduce
reduce(function, iterable)使⽤function(x, y)函数,将序列缩减成1个元素结果。
filter
filter(function, iterable)使⽤返回bool的function对序列过滤,返回满⾜条件的结果。
filter(function, iterable)的返回result也是⼀个可遍历的对象,我们可以使⽤list将其转化为可打印的对象。
groupby函数
groupby是类似SQL中groupby的聚合函数(但只会相邻相同元素聚合)。按照指定key进⾏数据分组,语法:groupby(iterable, key=None)
构建⼀个数据,是个list,每个list⾥⾯是⼀个字典,包括⽂章的id、title、和分类。
如果想要按照category将⽂章聚合在⼀起,怎么操作呢?当然可以使⽤for循环加⼀个字典实现,但是groupby会更⽅便⼀点。 但是python中的groupby只能实现相邻元素相同的聚合,因此我们⾸先需要对它进⾏排序:groupby是什么函数
使⽤groupby聚合:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论