作者 | 陳祥安 來源 | Python學習開發
最近做了個資料合并的需求這裡記錄下:
要求如下:
dict_of_list1 = [{"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}, {"name": "wangwu", "age": 20}]dict_of_list2 = [{"name": "zhangsan", "province": "shandong"}, {"name": "lisi", "province": "changsha"}, {"name": "xiaohong", "province": "guangxi"}, {"name": "wangwu", "province": "xizang"}]
将上面的兩個清單的字典進行合并将名字一樣的項目放在一起。
形如:
[{"name":"zhangsan","age":18,"province":"shandong"},{"name":"xiaohong","province":"guangxi"}]
傳統解法
dict_of_list1 = [{"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}, {"name": "wangwu", "age": 20}]dict_of_list2 = [{"name": "zhangsan", "province": "shandong"}, {"name": "lisi", "province": "changsha"}, {"name": "xiaohong", "province": "guangxi"}, {"name": "wangwu", "province": "xizang"}]all_data = dict_of_list1 + dict_of_list2d = {}for item in all_data: name = item["name"] if name in d: d[name].update(item) else: d[name] = itemresult = []for k,v in d.items(): result.append(v)sorted(v)print(result)
根據要求得知,我們需要根據姓名一樣的進行合并,那麼可以建立一個新的字典可以把姓名當作字典的鍵,然後判斷這個鍵是否在這個字典中,如果不存在就是指派,否則去更新其值。因為它的值是字典類型是以可以通過update進行更新,這種方法可以适用到其他語言。
下面再來一個python獨有的解法。
通過分組函數
利用python标準庫
from operator import itemgetterfrom itertools import groupbyfrom collections import ChainMapdict_of_list1 = [{"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}, {"name": "wangwu", "age": 20}]dict_of_list2 = [{"name": "zhangsan", "province": "shandong"}, {"name": "lisi", "province": "changsha"}, {"name": "xiaohong", "province": "guangxi"}, {"name": "wangwu", "province": "xizang"}]key = itemgetter("name")all_data = dict_of_list1 + dict_of_list2all_data.sort(key=key)result_list = []for x, y in groupby(all_data, key=key): d = dict(ChainMap(*y)) result_list.append(d)sorted(result_list, key=key)print(result_list)
我們可以使用itertools子產品的groupby按照name進行分組
groupby有兩個參數第一個是一個可疊代對象,第二個是指定按照什麼去分組,類似我們排序時指定key的值,
這裡key的值可以使用lambda表達式,或者使用标準庫operator的itemgetter方法,實作相同的效果。
使用這個方法有一個要求那就是,需要提前對可疊代對象進行排序。
經過groupby修飾之後我們得到一個key和
itertools._grouper
對象,key就是我們指定那個鍵的值,這裡就是name的值,然後可以對
itertools._grouper
對象進行拆分,得到幾個字典,再通過collections的ChainMap對
其元素進行字典合并,之後轉為dict對象。最終加入到指定清單完成我們的任務。
該方法主要是熟悉Python一些比較實用的标準庫的用法。
···END···
精彩推薦
網際網路人辦公地鄙視鍊
程式員的雙肩包,大概能裝下整個宇宙!
前端學習資源分享,含Vue3.0全家桶,贈知識圖譜!
簡單!粗暴!這10門「熱門技術」課程,直接免費看!