详解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内置数据类型详解
Aug 18 Python
Python itertools模块详解
May 09 Python
Python自动调用IE打开某个网站的方法
Jun 03 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
Python 下载及安装详细步骤
Nov 04 Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 Python
python爬取招聘要求等信息实例
Nov 20 Python
解决python3.6用cx_Oracle库连接Oracle的问题
Dec 07 Python
python基于opencv 实现图像时钟
Jan 04 Python
Python中for后接else的语法使用
May 18 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Apr 02 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
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
php操作mongoDB实例分析
2014/12/29 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
从javascript语言本身谈项目实战
2006/12/27 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
Python 监测文件是否更新的方法
2019/06/10 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
2014/05/07 HTML / CSS
酒吧创业计划书
2014/01/18 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
自查自纠整改报告
2014/11/06 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
承诺书范本大全
2015/05/04 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
Python 文字识别
2022/05/11 Python