Python 標(biāo)準(zhǔn)庫(kù)實(shí)踐之合并字典組成的列表
點(diǎn)擊上方“Python學(xué)習(xí)開(kāi)發(fā)”,選擇“加為星標(biāo)”
第一時(shí)間關(guān)注Python技術(shù)干貨!

最近做了個(gè)數(shù)據(jù)合并的需求這里記錄下:
要求如下:
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"}]
將上面的兩個(gè)列表的字典進(jìn)行合并將名字一樣的項(xiàng)目放在一起。
形如:
[{"name":"zhangsan","age":18,"province":"shandong"},{"name":"xiaohong","province":"guangxi"}]傳統(tǒng)解法
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)
根據(jù)要求得知,我們需要根據(jù)姓名一樣的進(jìn)行合并,那么可以創(chuàng)建一個(gè)新的字典可以把姓名當(dāng)作字典的鍵,然后判斷這個(gè)鍵是否在這個(gè)字典中,如果不存在就是賦值,否則去更新其值。因?yàn)樗闹凳亲值漕?lèi)型所以可以通過(guò)update進(jìn)行更新,這種方法可以適用到其他語(yǔ)言。
下面再來(lái)一個(gè)python獨(dú)有的解法。
通過(guò)分組函數(shù)
利用python標(biāo)準(zhǔn)庫(kù)
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進(jìn)行分組
groupby有兩個(gè)參數(shù)第一個(gè)是一個(gè)可迭代對(duì)象,第二個(gè)是指定按照什么去分組,類(lèi)似我們排序時(shí)指定key的值,
這里key的值可以使用lambda表達(dá)式,或者使用標(biāo)準(zhǔn)庫(kù)operator的itemgetter方法,實(shí)現(xiàn)相同的效果。
使用這個(gè)方法有一個(gè)要求那就是,需要提前對(duì)可迭代對(duì)象進(jìn)行排序。
經(jīng)過(guò)groupby修飾之后我們得到一個(gè)key和itertools._grouper對(duì)象,key就是我們指定那個(gè)鍵的值,這里就是name的值,然后可以對(duì)itertools._grouper對(duì)象進(jìn)行拆分,得到幾個(gè)字典,再通過(guò)collections的ChainMap對(duì)
其元素進(jìn)行字典合并,之后轉(zhuǎn)為dict對(duì)象。最終加入到指定列表完成我們的任務(wù)。
該方法主要是熟悉Python一些比較實(shí)用的標(biāo)準(zhǔn)庫(kù)的用法。
推薦閱讀
