溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python鏈?zhǔn)接成湓趺词褂?/h1>
發(fā)布時(shí)間:2023-04-13 11:08:16 來(lái)源:億速云 閱讀:105 作者:iii 欄目:編程語(yǔ)言

本文小編為大家詳細(xì)介紹“Python鏈?zhǔn)接成湓趺词褂谩?,?nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Python鏈?zhǔn)接成湓趺词褂谩蔽恼履軒椭蠹医鉀Q疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

認(rèn)識(shí)ChainMap

Python的所提供的ChainMap類(就稱為鏈映射類),是個(gè)類似字典(dict)的類,用于快速鏈接許多個(gè)映射,以便將它們作為單個(gè)單元處理。它通常比創(chuàng)建一個(gè)新字典并運(yùn)行多個(gè)update()調(diào)用要快得多。

其語(yǔ)法格式如下:

xchainMap = collections.ChainMap(*maps)

說(shuō)明:語(yǔ)法格式中的collections是導(dǎo)入的完成模塊名稱。如果這樣導(dǎo)入該模塊:import collections as cts,則語(yǔ)法可變?yōu)椋篶lass cts.ChainMap(*maps),或則模糊導(dǎo)入:from collections import ChainMap,這樣可以修改為:ChainMap(*maps)。

ChainMap可將多個(gè)字典或其他映射組合在一起,創(chuàng)建一個(gè)單一的、可更新的視圖(字典列表)。如果沒(méi)有指定映射,則提供一個(gè)空字典,以便新的鏈?zhǔn)接成洌–hainMap)總是至少有一個(gè)映射可以。

鏈映射的底層映射存儲(chǔ)在一個(gè)列表中。該列表是公共的,可以使用maps屬性來(lái)訪問(wèn)或更新。除了maps屬性,鏈映射沒(méi)有其他的新擴(kuò)展?fàn)顟B(tài)。

ChainMap是通過(guò)引用來(lái)合并底層映射的。因此,如果其中一個(gè)底層映射得到更新,這些更改也將反映在ChainMap中。

鏈映射支持所有常用的字典(dict)方法。此外,還有一個(gè)maps屬性,用于創(chuàng)建新子上下文的方法,并且除了第一個(gè)映射,屬性maps可用于訪問(wèn)所有映射——maps是個(gè)列表。

對(duì)應(yīng)一個(gè)用戶可更新的映射列表,該列表從第一次搜索到最后一次搜索是有序的。它是唯一存儲(chǔ)的狀態(tài),可以通過(guò)修改來(lái)更改要搜索的映射。這樣的列表應(yīng)該始終至少包含一個(gè)映射。

來(lái)看下面的簡(jiǎn)單示例,代碼清單如下:

Python鏈?zhǔn)接成湓趺词褂?></p><p>運(yùn)行程序輸出結(jié)果如下:</p><pre class=ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}) [{'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}]

上述清單中,我們用兩個(gè)字典定義一個(gè)ChainMap對(duì)象(chain_map)。然后我們打印輸出ChainMap對(duì)象和maps屬性。正如在輸出中看到的,結(jié)果是這些字典的構(gòu)成視圖。

訪問(wèn)ChainMap的鍵值

我們可以通過(guò)使用keys()和values()方法來(lái)訪問(wèn)ChainMap的鍵和值。代碼示例如下:

Python鏈?zhǔn)接成湓趺词褂?></p><p>上述代碼輸出結(jié)果為:</p><pre class=KeysView(ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'})) ValuesView(ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}))

如程序輸出結(jié)果所示,chain_map.keys()的結(jié)果是一個(gè)KeysView(鍵視圖),chain_map.values()的結(jié)果是一個(gè)ValuesView(值視圖)。這兩個(gè)視圖類型內(nèi)置類,都是可迭代對(duì)象,可以分別遍歷相應(yīng)的鍵名和值對(duì)象。例如:

Python鏈?zhǔn)接成湓趺词褂?></p><p>輸出結(jié)果為:</p><pre class=key = a,value=A key = b,value=B key = one,value=1 key = two,value=2 鏈映射包含的值為: A;B;1;2;

結(jié)合代碼和輸出結(jié)果,很容易理解,即鏈?zhǔn)接成渚褪前讯鄠€(gè)映射(map有很多實(shí)現(xiàn),字典是其中的一種)打包成一個(gè)映射即鏈?zhǔn)接成?,然后可以像操作字典樣操作訪問(wèn)。比如像字典一樣這樣來(lái)訪問(wèn)某個(gè)鍵的值:

print(chain_map['b'] )

也就是通過(guò)使用鍵名:chain_map[' one ']來(lái)訪問(wèn)ChainMap底層字典中單個(gè)項(xiàng)的值。

為ChainMap添加新映射

ChainMap可以包含任意數(shù)量的字典。我們使用內(nèi)置的new_child()方法向ChainMap添加新字典。new_child()方法返回一個(gè)新的ChainMap,其中包含著新映射,后跟當(dāng)前實(shí)例中的所有映射。這里需要注意的一點(diǎn)是,新添加的字典將放在ChainMap的開(kāi)頭。來(lái)看示例:

Python鏈?zhǔn)接成湓趺词褂?></p><p>運(yùn)行程序,輸入結(jié)果如下:</p><pre class=Old: ChainMap({'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'}) New: ChainMap({'x': 0, 'y': 1}, {'one': 1, 'two': 2}, {'a': 'A', 'b': 'B'})

這里需要注意的是,用鏈?zhǔn)接成涞膎ew_child()方法添加新字典后,不改變?cè)瓉?lái)的鏈映射,會(huì)返回一個(gè)新的ChainMap對(duì)象。另外,如果你修改鏈?zhǔn)接成渌挠成浠蜃值?,變化也將體現(xiàn)在鏈?zhǔn)接成鋵?duì)象中。

另外,實(shí)踐中要當(dāng)心:如果你按照字典操作來(lái)添加新的鍵值對(duì),則該鍵值對(duì)會(huì)添加到鏈?zhǔn)接成渌牡谝粋€(gè)映射中,如:new_chain_map['X'] = 'Unkown' 。自己動(dòng)手試試看。

所含映射有相同鍵怎么辦?

底層上,鏈?zhǔn)接成渲饕菫榘讯鄠€(gè)字典或映射打包成一個(gè)映射,以便集中操作。如果所辦函的字典中有相同的鍵會(huì)怎樣呢?來(lái)看示例:

Python鏈?zhǔn)接成湓趺词褂?></p><p>運(yùn)行程序輸出結(jié)果如下:</p><pre class=ChainMap({'id': 21001, 'country': '大秦', 'emperor': '嬴政'}, {'name': '李靖', 'country': '大唐', 'title': '元帥'}) 大秦 ('name', '李靖') ('country', '大秦') ('title', '元帥') ('id', 21001) ('emperor', '嬴政')

很顯然,鏈接的映射中出現(xiàn)相同字典項(xiàng)時(shí),只讀取第一個(gè),以第一個(gè)為準(zhǔn),而且當(dāng)你更新一個(gè)鍵的值時(shí),它也只是更新第一個(gè)映射內(nèi)容的鍵值。

如果你想一次更新所有映射中的相同鍵的值怎么辦呢?你可以自定義一個(gè)ChainMap子類來(lái)實(shí)現(xiàn),或定義更新方法。因?yàn)镃hainMap中有個(gè)屬性maps持有完整的各個(gè)映射,可以基于此屬性來(lái)完成相同鍵的一次性更新。這里簡(jiǎn)單給個(gè)通過(guò)方法的方式實(shí)現(xiàn)多映射相同鍵的一次更新。示例代碼如下:

Python鏈?zhǔn)接成湓趺词褂?></p><p class=讀到這里,這篇“Python鏈?zhǔn)接成湓趺词褂谩蔽恼乱呀?jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI