详解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的Treq on Twisted来进行HTTP压力测试
Apr 16 Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
用python处理图片实现图像中的像素访问
May 04 Python
在python中安装basemap的教程
Sep 20 Python
python 随机打乱 图片和对应的标签方法
Dec 14 Python
python实现贪吃蛇小游戏
Mar 21 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
python return逻辑判断表达式实现解析
Dec 02 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
Python os库常用操作代码汇总
Nov 03 Python
Python中tkinter的用户登录管理的实现
Apr 22 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
Thinkphp中的volist标签用法简介
2014/06/18 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python和php通信乱码问题解决方法
2014/04/15 Python
Python实现购物程序思路及代码
2017/07/24 Python
python中模块查找的原理与方法详解
2017/08/11 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
物理系毕业生自荐书
2014/06/13 职场文书
考察邀请函范文
2015/01/31 职场文书
干部培训工作总结2015
2015/05/25 职场文书