python的几个常用高级函数

介绍几个较为常用的高级函数:

  • Counter:计数器
  • defaultdict:带默认值的字典
  • map、reduce、filter:针对序列操作的函数
  • groupby:类似SQL中groupby的聚合函数(但只会相邻相同元素聚合)

1、Counter 计数器

Counter(计数器):用于追踪值的出现次数,Counter类继承dict类,所以它能使用dict类里面的方法。

对iterable进行计数:

import collections
counter = collections.Counter(['a', 'b', 'c', 'a', 'b', 'a'])
print(counter)
# 结果: Counter({'a': 3, 'b': 2, 'c': 1})

使用update可以往Counter新增内容:

counter.update(['c', 'b', 'c', 'd', 'c'])
print(counter)
# 结果: Counter({'c': 4, 'a': 3, 'b': 3, 'd': 1})

可像字典一样输出key/value:

for key, value in counter.items():
    print(key, value)

很方便的输出最高频率的数据:

print(counter.most_common(3))

2、defaultdict

直接访问字典不存在的key是会报错的,所以一般需要做初始化:

if key not in d:
    d[key] = 0
    d[key] = []
d[key] += 3
d[key].append(123)
# 这样设置比较麻烦,使用defaultdict更简单

dict = defaultdict(factory_function)
factory_function可以是str、int、list、set,可以省略初始化

from collections import defaultdict
# 默认的value为int类型,直接加数字
dint = defaultdict(int)
dint["a"] += 3
dint["b"] += 4
print(dint)
# 结果:defaultdict(<class 'int'>, {'a': 3, 'b': 4})

# 默认的value为list类型,直接添加元素
dlist = defaultdict(list)
dlist["a"].append(1)
dlist["a"].extend([2,3,4])
print(dlist)
# 结果:defaultdict(<class 'list'>, {'a': [1, 2, 3, 4]})

3、map、reduce、filter函数

map(function,iterable,…)
给序列的每个元素应用一个函数,返回一个迭代器。

list1 = [1,2,3,4]
result = map(lambda x: x**2, list1)
print(list(result)
# 结果:[1, 4, 9, 16]

reduce(function,iterable)
使用function(x,y)函数,将序列缩减成1个元素结果。

from functools import reduce
res = reduce(lambda x, y: x+y,list1)
print(res)
# 结果:10,等于将每个元素相加

filter(function,iterable)
使用返回bool的function对序列过滤,返回满足条件的结果。

list2 = range(10)
result = filter(lambda x: x%2==0,list2)
print(result)
print(type(result))
print(list(result))
# 结果:
# <filter object at 0x000001B1EC1D3FD0>
# <class 'filter'>
# [0, 2, 4, 6, 8]

这里生成的是filter的类,需要用list()转换为列表。

4、groupby函数

按照指定key进行数据分组:groupby(iterable,key=None)

datas = [
    {"id": 101, "title": "标题1", "category": "Python"},
    {"id": 102, "title": "标题2", "category": "Java"},
    {"id": 103, "title": "标题3", "category": "C++"},
    {"id": 104, "title": "标题4", "category": "Python"},
    {"id": 105, "title": "标题5", "category": "Python"},
    {"id": 106, "title": "标题6", "category": "Java"}
]
from itertools import groupby
# 先将数据按目标key排序
datas = sorted(datas, key = lambda x: x["category"])
result = groupby(datas,key=lambda x: x["category"])
print(result)
print(list(result))

result = groupby(datas,key=lambda x:x["category"])
for key, values in result:
    print(key, list(values))
# 结果:
# <itertools.groupby object at 0x000001DF87348590>
# [('C++', <itertools._grouper object at 0x000001DF871A5EE0>), ('Java', <itertools._grouper object at 0x000001DF8732E610>), ('Python', <itertools._grouper object at 0x000001DF8732E460>)]
# C++ [{'id': 103, 'title': '标题3', 'category': 'C++'}]
# Java [{'id': 102, 'title': '标题2', 'category': 'Java'}, {'id': 106, 'title': '标题6', 'category': 'Java'}]
# Python [{'id': 101, 'title': '标题1', 'category': 'Python'}, {'id': 104, 'title': '标题4', 'category': 'Python'}, {'id': 105, 'title': '标题5', 'category': 'Python'}]
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的小猪侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值