天天看點

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)