详解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基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
python处理html转义字符的方法详解
Jul 01 Python
实现python版本的按任意键继续/退出
Sep 26 Python
Python列表切片用法示例
Apr 19 Python
只需7行Python代码玩转微信自动聊天
Jan 27 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
Python银行系统实战源码
Oct 25 Python
Python3 获取文件属性的方式(时间、大小等)
Mar 12 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
python中spy++的使用超详细教程
Jan 29 Python
python3实现无权最短路径的方法
May 12 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 图片上添加透明度渐变的效果
2009/06/29 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
JavaScript的面向对象方法以及差别
2008/03/31 Javascript
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
小程序云开发实战小结
2018/10/25 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
Python文件操作的面试题
2013/06/22 面试题
农行实习自我鉴定
2013/09/22 职场文书
优秀团员个人的自我评价
2013/10/02 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
诚信考试标语
2014/06/24 职场文书