Python的groupby
2015-12-25 14:34
603 查看
今天在一个群里看到一个问题
[{id:1,name:a},{id:2,age:22}]将列表中 id相同的元素合为一个元素 属性合并起来 相同属性覆盖或者取最大值 里面的json长短不一
可能是Java用得久了,第一反应就是把使用一个HashMap ,然后便历属性,便可以做到了。用python实现一下:
写得不太简洁,但是可以实现需求,想想那些一行python代码,就找了一下python的相关资料,就发现了:https://docs.python.org/2/library/itertools.html#itertools.groupby
这个函数功能类似于SQL的分组。使用groupby前,首先需要使用相同的keyfunc对iterable进行排序,比如调用内建的sorted函数。然后,groupby返回迭代器,每次迭代的元素是元组(key值, iterable中具有相同key值的元素的集合的子迭代器)。
简单的说,就是对于可迭代的对象,可以 以指定的元素进行分组,比如我现在所遇到的情况,就可以使用 元素的 id进行分组。分组后数据是这样的:
上面的写法是手动分组,现在使用group by 函数帮我们处理,就可以简化为:
[{id:1,name:a},{id:2,age:22}]将列表中 id相同的元素合为一个元素 属性合并起来 相同属性覆盖或者取最大值 里面的json长短不一
可能是Java用得久了,第一反应就是把使用一个HashMap ,然后便历属性,便可以做到了。用python实现一下:
# -*- coding: utf-8 -*- import json # Create your tests here. j = json.loads('[{"id":1,"name":"a"},{"id":1,"name":"b"},{"id":1,"age":32},{"id":2,"age":32},{"id":2,"name":"22"}]') d = {} def biz(a): try: v = d[a['id']] for kk, vv in a.iteritems(): if hasattr(v, kk): if isinstance(vv, unicode): v[kk] = vv else: v[kk] = vv if vv > v[kk] else v[kk] else: v[kk] = vv except: d[a['id']] = a map(biz, j) print(d)
写得不太简洁,但是可以实现需求,想想那些一行python代码,就找了一下python的相关资料,就发现了:https://docs.python.org/2/library/itertools.html#itertools.groupby
这个函数功能类似于SQL的分组。使用groupby前,首先需要使用相同的keyfunc对iterable进行排序,比如调用内建的sorted函数。然后,groupby返回迭代器,每次迭代的元素是元组(key值, iterable中具有相同key值的元素的集合的子迭代器)。
简单的说,就是对于可迭代的对象,可以 以指定的元素进行分组,比如我现在所遇到的情况,就可以使用 元素的 id进行分组。分组后数据是这样的:
[{k1:[{},{}],k2:[{},{}]}]
上面的写法是手动分组,现在使用group by 函数帮我们处理,就可以简化为:
# -*- coding: utf-8 -*- import json from itertools import groupby j = json.loads('[{"id":1,"name":"a"},{"id":1,"name":"b"},{"id":1,"age":32},{"id":2,"age":32},{"id":2,"name":"22"}]') result = [] def merge(a, b): for k, v in a.iteritems(): b[k] = v if k not in b or isinstance(b[k], unicode) else b[k] if b[k] > v else v return b for k, group in groupby(j, lambda x: x['id']): result.append(reduce(lambda a, b: merge(a, b), group)) print(result)
相关文章推荐
- python 上下文管理器
- python中的urlencode与urldecode
- 【极客学院】-python学习笔记-Python快速入门(面向对象-引入外部文件-Web2Py创建网站)
- 用Python获取命令行输出
- python线程与进程
- python/逻辑回归
- Python基础教程 正则表达式 学习笔记
- Python编程(二):Python进程、线程的那点事儿
- Python标准库的学习准备
- Python continue pass和break
- Python循环语句
- python 代码格式化工具:autopep8
- 几个有用的python脚本
- Blender Python
- 业务系统JSON日志通过python处理并导入Hive方案
- Python学习--爬虫
- python自动化测试(3)- 自动化框架及工具
- 2015.12.25Python 简易爬虫-
- k均值聚类与谱聚类的两个实例
- python multiprocessing example