今天在一個群里看到一個問題
[{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)