亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python ChainMap的使用和說明詳解

系統(tǒng) 2126 0

ChainMap是Python collections模塊中的一個成員,它用來將多個map組合到一起。Chain是鏈條的意思,字面意思就是把map串聯(lián)到一起。

問題的背景是我們有多個字典或者映射,想把它們合并成為一個單獨的映射,有人說可以用update進行合并,這樣做的問題就是新建了一個數(shù)據(jù)結(jié)構(gòu)以致于當我們對原來的字典進行更改的時候不會同步。如果想建立一個同步的查詢方法,可以使用ChainMap

先看一下初步使用

            
from collections import ChainMap
a = {"x":1, "z":3}
b = {"y":2, "z":4}
c = ChainMap(a,b)
print(c)
print("x: {}, y: {}, z: {}".format(c["x"], c["y"], c["z"]))


          

輸出:

ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})
x: 1, y: 2, z: 3
[Finished in 0.1s]

這是ChainMap最基本的使用,可以用來合并兩個或者更多個字典,當查詢的時候,從前往后依次查詢。

有一個注意點就是當對ChainMap進行修改的時候總是只會對第一個字典進行修改

            
In [6]: a = {"x":1, "z":3}

In [7]: b = {"y":2, "z":4}

In [8]: c = ChainMap(a, b)

In [9]: c
Out[9]: ChainMap({'z': 3, 'x': 1}, {'z': 4, 'y': 2})

In [10]: c["z"]
Out[10]: 3

In [11]: c["z"] = 4

In [12]: c
Out[12]: ChainMap({'z': 4, 'x': 1}, {'z': 4, 'y': 2})

In [13]: c.pop('z')
Out[13]: 4

In [14]: c
Out[14]: ChainMap({'x': 1}, {'z': 4, 'y': 2})

In [15]: del c["y"]
---------------------------------------------------------------------------
KeyError                 Traceback (most recent call last)
。。。。。。
KeyError: "Key not found in the first mapping: 'y'"
          

ChainMap和帶有作用域的值,諸如全局變量,局部變量之間工作的時候特別有效,

            
In [4]: a = ChainMap()

In [5]: a["x"]=1

In [6]: a
Out[6]: ChainMap({'x': 1})

In [7]: b = a.new_child()

In [8]: b
Out[8]: ChainMap({}, {'x': 1})

In [9]: b["x"] = 2

In [10]: b
Out[10]: ChainMap({'x': 2}, {'x': 1})

In [11]: b["y"] = 3

In [12]: b
Out[12]: ChainMap({'x': 2, 'y': 3}, {'x': 1})

In [13]: a
Out[13]: ChainMap({'x': 1})

In [14]: c = a.new_child()

In [15]: c
Out[15]: ChainMap({}, {'x': 1})

In [16]: c["x"]
Out[16]: 1

In [17]: c["y"] = 1

In [18]: c
Out[18]: ChainMap({'y': 1}, {'x': 1})

In [19]: d = c.parents()
---------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)

            
               in 
              
                ()
----> 1 d = c.parents()

TypeError: 'ChainMap' object is not callable

In [20]: d = c.parents

In [21]: d
Out[21]: ChainMap({'x': 1})

In [22]: d is a
Out[22]: False

In [23]: d == a
Out[23]: True


              
            
          

從原理上面講,ChainMap實際上是把放入的字典存儲在一個隊列中,當進行字典的增加刪除等操作只會在第一個字典上進行,當進行查找的時候會依次查找,new_child()方法實質(zhì)上是在列表的第一個元素前放入一個字典,默認是{},而parents是去掉了列表開頭的元素

            
In [24]: a = {"x":1, "z":3}

In [25]: b = {"y":2, "z":4}

In [26]: c = ChainMap(a,b)

In [27]: c
Out[27]: ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})

In [28]: c.maps
Out[28]: [{'x': 1, 'z': 3}, {'y': 2, 'z': 4}]

In [29]: c.parents
Out[29]: ChainMap({'y': 2, 'z': 4})

In [30]: c.parents.maps
Out[30]: [{'y': 2, 'z': 4}]

In [31]: c.parents.parents
Out[31]: ChainMap({})

In [32]: c.parents.parents.parents
Out[32]: ChainMap({})
          

也正是因為底層是列表實現(xiàn)的,所以實際上ChainMap查詢的字典實際上還是原來的字典的引用

ChainMap文檔和示例:https://docs.python.org/3/library/collections.html#collections.ChainMap

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产精品综合久久网络 | 欧美 日韩 中文字幕 | 欧美性猛交ⅹxxx乱大交按摩 | 日本一区视频在线 | 黄色大全网站 | 四虎最新网址入口 | 四虎永久精品免费网址大全 | 国产真实伦视频在线视频 | 国产一区二区不卡免费观在线 | 曰本一区二区三区 | 日本二区视频 | 综合久久综合久久 | 成人免费黄网站 | 国产成人免费a在线视频色戒 | 国内精品免费网站牛牛 | 久草视频中文 | 看免费黄色一级视频 | 日本特黄特色aaa大片免费欧 | 亚洲另类图片专区 | 亚洲狠狠婷婷综合久久久图片 | 一级午夜视频 | 老头老太做爰xxx视频 | 国产小视频在线观看免费 | 久久久久久网址 | 久久精品综合一区二区三区 | 伊人色综合久久天天 | 豆国产93在线 | 亚洲 | 国产一区二区三区欧美精品 | 东京干手机福利视频 | 日韩综合在线 | 欧美一区二区三区精品国产 | 一级黄片一级毛片 | 国产激情一级毛片久久久 | 色黄网站青青草原免费 | 五月天婷婷缴情五月免费观看 | 中文字幕视频在线播放 | 四虎国产永久在线观看 | 亚洲视频在线免费播放 | 伊人久久综合影院 | 在线看的成人性视频 | 精品综合久久久久久88小说 |