天天看點

python groupby用法_Python 标準庫實踐之合并字典組成的清單

python groupby用法_Python 标準庫實踐之合并字典組成的清單

作者 | 陳祥安 來源 | Python學習開發

python groupby用法_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···

精彩推薦

python groupby用法_Python 标準庫實踐之合并字典組成的清單

 網際網路人辦公地鄙視鍊

python groupby用法_Python 标準庫實踐之合并字典組成的清單

 程式員的雙肩包,大概能裝下整個宇宙!

python groupby用法_Python 标準庫實踐之合并字典組成的清單

 前端學習資源分享,含Vue3.0全家桶,贈知識圖譜!

python groupby用法_Python 标準庫實踐之合并字典組成的清單

 簡單!粗暴!這10門「熱門技術」課程,直接免費看!

python groupby用法_Python 标準庫實踐之合并字典組成的清單
python groupby用法_Python 标準庫實踐之合并字典組成的清單