首页 > 编程语言 > 详细

Python的groupby

时间:2015-12-25 15:06:03      阅读:403      评论:0      收藏:0      [点我收藏+]

今天在一个群里看到一个问题

 

[{id:1,name:a},{id:2,age:22}]将列表中 id相同的元素合为一个元素 属性合并起来  相同属性覆盖或者取最大值 里面的json长短不一

 

可能是Java用得久了,第一反应就是把使用一个HashMap ,然后便历属性,便可以做到了。用python实现一下:

 

 1 # -*- coding: utf-8 -*-
 2 import json
 3 
 4 # Create your tests here.
 5 j = json.loads([{"id":1,"name":"a"},{"id":1,"name":"b"},{"id":1,"age":32},{"id":2,"age":32},{"id":2,"name":"22"}])
 6 d = {}
 7 
 8 
 9 def biz(a):
10     try:
11         v = d[a[id]]
12         for kk, vv in a.iteritems():
13             if hasattr(v, kk):
14                 if isinstance(vv, unicode):
15                     v[kk] = vv
16                 else:
17                     v[kk] = vv if vv > v[kk] else v[kk]
18             else:
19                 v[kk] = vv
20     except:
21         d[a[id]] = a
22 
23 
24 map(biz, j)
25 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 函数帮我们处理,就可以简化为:

 1 # -*- coding: utf-8 -*-
 2 import json
 3 from itertools import groupby
 4 j = json.loads([{"id":1,"name":"a"},{"id":1,"name":"b"},{"id":1,"age":32},{"id":2,"age":32},{"id":2,"name":"22"}])
 5 result = []
 6 def merge(a, b):
 7     for k, v in a.iteritems():
 8         b[k] = v if k not in b or isinstance(b[k], unicode) else b[k] if b[k] > v else v
 9     return b
10 
11 for k, group in groupby(j, lambda x: x[id]):
12     result.append(reduce(lambda a, b: merge(a, b), group))
13 print(result)

 

Python的groupby

原文:http://www.cnblogs.com/pangzy/p/python_groupby.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!