python中group by用法_Python的groupby

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

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

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

1 #-*- coding: utf-8 -*-

2 importjson3

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 defbiz(a):10 try:11 v = d[a['id']]12 for kk, vv ina.iteritems():13 ifhasattr(v, kk):14 ifisinstance(vv, unicode):15 v[kk] =vv16 else:17 v[kk] = vv if vv > v[kk] elsev[kk]18 else:19 v[kk] =vv20 except:21 d[a['id']] =a22

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 importjson3 from itertools importgroupby4 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 defmerge(a, b):7 for k, v ina.iteritems():8 b[k] = v if k not in b or isinstance(b[k], unicode) else b[k] if b[k] > v elsev9 returnb10

11 for k, group in groupby(j, lambda x: x['id']):12 result.append(reduce(lambdaa, b: merge(a, b), group))13 print(result)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值