详解Python中的分组函数groupby和itertools)


Posted in Python onJuly 11, 2018

具体代码如下所示:

from operator import itemgetter #itemgetter用来去dict中的key,省去了使用lambda函数
from itertools import groupby #itertool还包含有其他很多函数,比如将多个list联合起来。。
d1={'name':'zhangsan','age':20,'country':'China'}
d2={'name':'wangwu','age':19,'country':'USA'}
d3={'name':'lisi','age':22,'country':'JP'}
d4={'name':'zhaoliu','age':22,'country':'USA'}
d5={'name':'pengqi','age':22,'country':'USA'}
d6={'name':'lijiu','age':22,'country':'China'}
lst=[d1,d2,d3,d4,d5,d6]
#通过country进行分组:
lst.sort(key=itemgetter('country')) #需要先排序,然后才能groupby。lst排序后自身被改变
lstg = groupby(lst,itemgetter('country')) 
#lstg = groupby(lst,key=lambda x:x['country']) 等同于使用itemgetter()
for key,group in lstg:
  for g in group: #group是一个迭代器,包含了所有的分组列表
    print key,g

返回:

China {'country': 'China', 'age': 20, 'name': 'zhangsan'}
China {'country': 'China', 'age': 22, 'name': 'lijiu'}
JP {'country': 'JP', 'age': 22, 'name': 'lisi'}
USA {'country': 'USA', 'age': 19, 'name': 'wangwu'}
USA {'country': 'USA', 'age': 22, 'name': 'zhaoliu'}
USA {'country': 'USA', 'age': 22, 'name': 'pengqi'}
print [key for key,group in lstg] #返回:['China', 'JP', 'USA']
print [(key,list(group)) for key,group in lstg]
#返回的list中包含着三个元组:
[('China', [{'country': 'China', 'age': 20, 'name': 'zhangsan'}, {'country': 'China', 'age': 22, 'name': 'lijiu'}]), ('JP', [{'country': 'JP', 'age': 22, 'name': 'lisi'}]), ('USA', [{'country': 'USA', 'age': 19, 'name': 'wangwu'}, {'country': 'USA', 'age': 22, 'name': 'zhaoliu'}, {'country': 'USA', 'age': 22, 'name': 'pengqi'}])]
print dict([(key,list(group)) for key,group in lstg])
#返回的是一个字典:
{'JP': [{'country': 'JP', 'age': 22, 'name': 'lisi'}], 'China': [{'country': 'China', 'age': 20, 'name': 'zhangsan'}, {'country': 'China', 'age': 22, 'name': 'lijiu'}], 'USA': [{'country': 'USA', 'age': 19, 'name': 'wangwu'}, {'country': 'USA', 'age': 22, 'name': 'zhaoliu'}, {'country': 'USA', 'age': 22, 'name': 'pengqi'}]}
print dict([(key,len(list(group))) for key,group in lstg])
#返回每个分组的个数:
{'JP': 1, 'China': 2, 'USA': 3}
#返回包含有2个以上元素的分组
print [key for key,group in groupby(sorted(lst,key=itemgetter('country')),itemgetter('country')) if len(list(group))>=2]
#返回:['China', 'USA']
lstg = groupby(sorted(lst,key=itemgetter('country')),key=itemgetter('country')) 
lstgall=[(key,list(group)) for key,group in lstg ]
print dict(filter(lambda x:len(x[1])>2,lstgall)) 
#过滤出分组后的元素个数大于2个的分组,返回:
{'USA': [{'country': 'USA', 'age': 19, 'name': 'wangwu'}, {'country': 'USA', 'age': 22, 'name': 'zhaoliu'}, {'country': 'USA', 'age': 22, 'name': 'pengqi'}]}

自定义分组:

from itertools import groupby
lst=[2,8,11,25,43,6,9,29,51,66]
def gb(num):
  if num <= 10:
    return 'less'
  elif num >=30:
    return 'great'
  else:
    return 'middle'
print [(k,list(g))for k,g in groupby(sorted(lst),key=gb)]

返回:

[('less', [2, 6, 8, 9]), ('middle', [11, 25, 29]), ('great', [43, 51, 66])]

总结

以上所述是小编给大家介绍的Python中的分组函数groupby和itertools),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
使用python实现baidu hi自动登录的代码
Feb 10 Python
Python实现的简单文件传输服务器和客户端
Apr 08 Python
实例解析Python中的__new__特殊方法
Jun 02 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
Jan 03 Python
Pyspark读取parquet数据过程解析
Mar 27 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
May 20 Python
python和js交互调用的方法
Jun 23 Python
Python3爬虫中Selenium的用法详解
Jul 10 Python
Python中的groupby分组功能的实例代码
Jul 11 #Python
python中实现字符串翻转的方法
Jul 11 #Python
Python3.7中安装openCV库的方法
Jul 11 #Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 #Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 #Python
python 对txt中每行内容进行批量替换的方法
Jul 11 #Python
python遍历文件夹,指定遍历深度与忽略目录的方法
Jul 11 #Python
You might like
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
php生成文件
2007/01/15 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
预加载css或javascript的js代码
2010/04/23 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
vue实现循环切换动画
2018/10/17 Javascript
详解React 条件渲染
2020/07/08 Javascript
Django接受前端数据的几种方法总结
2016/11/04 Python
python保存数据到本地文件的方法
2018/06/23 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
基于python实现名片管理系统
2018/11/30 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
python爬取天气数据的实例详解
2020/11/20 Python
Python 中的函数装饰器和闭包详解
2021/02/06 Python
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
《画家乡》教学反思
2014/04/22 职场文书
副处级干部考察材料
2014/05/17 职场文书
软件售后服务方案
2014/05/29 职场文书
搞笑结婚保证书
2015/05/08 职场文书
三八节祝酒词
2015/08/11 职场文书
班级班风口号大全
2015/12/25 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang