详解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怎么学好python?
Oct 07 Python
python 不关闭控制台的实现方法
Oct 23 Python
python简单实现旋转图片的方法
May 30 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
Python编程入门之Hello World的三种实现方式
Nov 13 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
树莓派采用socket方式文件传输(python)
Jun 22 Python
使用python检查yaml配置文件是否符合要求
Apr 09 Python
在ipython notebook中使用argparse方式
Apr 20 Python
Python API 操作Hadoop hdfs详解
Jun 06 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 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
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
PHP5.3新特性小结
2016/02/14 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
一些javascript一些题目的解析
2010/12/25 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
jquery的live使用注意事项
2014/02/18 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
详解React 元素渲染
2020/07/07 Javascript
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
python ip正则式
2009/05/07 Python
Python Socket编程详细介绍
2017/03/23 Python
Python统计单词出现的次数
2018/04/04 Python
python多线程同步之文件读写控制
2021/02/25 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
Pytorch之Variable的用法
2019/12/31 Python
python算的上脚本语言吗
2020/06/22 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
项目专员岗位职责
2013/12/04 职场文书
销售员岗位职责范本
2014/02/03 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
2015年员工工作总结范文
2015/04/08 职场文书