<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          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="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  特级西西高清4Www电影 | 波多野结衣系列在线天堂 | 操逼AV播放| 国产乱子伦-区二区三区熟睡91 | 国产成人主播 |