<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    Python 標(biāo)準(zhǔn)庫(kù)實(shí)踐之合并字典組成的列表

    共 2785字,需瀏覽 6分鐘

     ·

    2020-09-03 00:56


    點(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 ChainMap
    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"}]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ù)的用法。

    推薦閱讀


    快速上手 Python 命令行模塊 Click

    構(gòu)建 Python C 擴(kuò)展模塊


    瀏覽 29
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    青青草原网 | 欧美香蕉在线观看 | xxxxx日本18 | 成人精品人妻一区二区三区 | 亚洲黄色电影在线播放 |