详解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 相关文章推荐
详解Python3.1版本带来的核心变化
Apr 07 Python
代码分析Python地图坐标转换
Feb 08 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
python实现猜拳游戏
Mar 04 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 Python
如何创建一个Flask项目并进行简单配置
Nov 18 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
javascript之函数直接量(function(){})()
2007/06/29 Javascript
HTML中事件触发列表与解说
2007/07/09 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
2017/03/25 jQuery
vue2.0全局组件之pdf详解
2017/06/26 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
解决python3中解压zip文件是文件名乱码的问题
2018/03/22 Python
python 日志增量抓取实现方法
2018/04/28 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
中英文求职信范文
2014/01/27 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
个人借款担保书
2014/04/02 职场文书
我的教育故事演讲稿
2014/05/04 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python