python map用法_Python中ChainMap的一种实用用法
Python部落(python.freelycode.com)組織翻譯,禁止轉(zhuǎn)載,歡迎轉(zhuǎn)發(fā)。
簡(jiǎn)而言之ChainMap:將多個(gè)字典視為一個(gè),解鎖Python超能力。
Python標(biāo)準(zhǔn)庫(kù)中的集合模塊包含許多為性能而設(shè)計(jì)的實(shí)用的數(shù)據(jù)結(jié)構(gòu)。著名的包括命名元組或計(jì)數(shù)器。
今天,通過(guò)實(shí)例,我們來(lái)看看鮮為人知的ChainMap。通過(guò)瀏覽具體的示例,我希望給你一個(gè)提示,關(guān)于在更高級(jí)的Python工作中使用ChainMap將如何從中受益。
免責(zé)聲明:這篇文章是關(guān)于Python的一個(gè)相當(dāng)高級(jí)的特性。如果你剛?cè)腴T,請(qǐng)等一等!
ChainMap是什么?
ChainMap是由Python標(biāo)準(zhǔn)庫(kù)提供的一種數(shù)據(jù)結(jié)構(gòu),允許你將多個(gè)字典視為一個(gè)。
ChainMap上的官方文檔如下:
ChainMap將多個(gè)dict或其他映射組合在一起以創(chuàng)建單個(gè)可更新視圖。[…] 查找基礎(chǔ)映射,直到找到key為止。[…]如果其中一個(gè)基礎(chǔ)映射得到更新,這些更改將反映在ChainMap中。 […] 支持所有常用的字典方法。
換句話說(shuō):ChainMap是一個(gè)基于多dict的可更新的視圖,它的行為就像一個(gè)普通的dict。
你以前可能從來(lái)沒(méi)有聽(tīng)說(shuō)過(guò)ChainMap,你可能會(huì)認(rèn)為ChainMap的使用情況是非常特定的。坦率地說(shuō),你是對(duì)的。
我知道的用例包括:通過(guò)多個(gè)字典搜索
提供鏈缺省值
經(jīng)常計(jì)算字典子集的性能關(guān)鍵的應(yīng)用程序
我們將通過(guò)兩個(gè)例子來(lái)說(shuō)明。
注意:這兩個(gè)例子是受到Mike Driscoll在文章的啟發(fā)。為了我的目的,我已經(jīng)調(diào)整了它們,但一定要閱讀他的帖子另一個(gè)關(guān)于ChainMap的觀點(diǎn)!
示例:購(gòu)物清單
作為使用ChainMap的第一個(gè)例子,讓我們考慮一張購(gòu)物清單。我們的清單可能包含玩具,電腦,甚至衣服。所有這些條目都有價(jià)格,所以我們將把我們的條目存儲(chǔ)在名稱價(jià)格映射中。
現(xiàn)在我們可以使用ChainMap在這些不同的集合上建立一個(gè)單一的視圖:
這使得我們可以查詢清單,就像它是一個(gè)單一的字典:
正如官方文檔所述,ChainMap支持所有常用的字典方法。我們可以使用.get()來(lái)搜索可能不存在的條目,或者使用 .pop()刪除條目。
如果我們現(xiàn)在把玩具添加到toys字典里,它也將在清單中可用。這是ChainMap的可更新的方面。
Oh和ChainMap有一個(gè)恰當(dāng)?shù)淖址硎拘问?#xff1a;
一個(gè)很好的特點(diǎn)是,在我們的例子中,toys, computers和clothing都是在相同的上下文中(解釋器),它們可以來(lái)自完全不同的模塊或包。這是因?yàn)镃hainMap通過(guò)引用存儲(chǔ)底層字典。
第一個(gè)例子是使用ChainMap一次搜索多個(gè)字典。
事實(shí)上,當(dāng)構(gòu)建ChainMap時(shí),我們所做的就是有效地構(gòu)建一系列字典。當(dāng)查找清單中的一個(gè)項(xiàng)時(shí),toys首先被查找,然后是computers,最后是clothing。
ChainMap真的只是一個(gè)映射鏈!
實(shí)際上,ChainMap的另一個(gè)任務(wù)是維護(hù)鏈的默認(rèn)值。
我們將以一個(gè)命令行應(yīng)用程序的例子來(lái)說(shuō)明這是什么意思。
示例:CLI配置
讓我們面對(duì)現(xiàn)實(shí),管理命令行應(yīng)用程序的配置可能是困難的。
配置來(lái)自多個(gè)源:命令行參數(shù)、環(huán)境變量、本地文件等。
我們通常實(shí)施優(yōu)先級(jí)的概念:如果A和B都定義參數(shù)P,A的P值將被使用,因?yàn)樗膬?yōu)先級(jí)高于B。
例如,如果傳遞了命令行參數(shù),我們可能希望在環(huán)境變量上使用命令行參數(shù)。
如何輕松地管理配置源的優(yōu)先級(jí)?
一個(gè)答案是將所有配置源存儲(chǔ)在ChainMap中。
因?yàn)镃hainMap中的查找是連續(xù)地對(duì)每個(gè)底層映射執(zhí)行的(按照他們傳給構(gòu)造函數(shù)的順序),所以我們可以很容易地實(shí)現(xiàn)我們尋找的優(yōu)先級(jí)。
下面是一個(gè)簡(jiǎn)單的命令行應(yīng)用程序。調(diào)試參數(shù)從命令行參數(shù)、環(huán)境變量或硬編碼默認(rèn)值中提取:
在執(zhí)行腳本時(shí),我們可以檢查是否首先在命令行參數(shù)中查找debug,然后是環(huán)境變量,最后是默認(rèn)值:
整潔,對(duì)吧?
我為什么關(guān)心?
坦率地說(shuō),ChainMap是那些你可以忽略的Python特性之一。
還有其他ChainMap的替代方案。例如,使用更新循環(huán)——例如創(chuàng)建一個(gè)dict并用字典.update()它——可能奏效。但是,這只有在您不需要跟蹤項(xiàng)目的起源時(shí)才有效,就像我們的多源CLI配置示例中的情況一樣。
但是,當(dāng)你知道ChainMap存在的時(shí)候,ChainMap可以讓你更輕松,你的代碼更優(yōu)雅。
事實(shí)上,我第一次使用ChainMap是在一周前。為什么以前沒(méi)有呢?我根本沒(méi)用過(guò)。
我使用它是因?yàn)槲倚枰l繁地計(jì)算字典的子集(基于值的屬性),這代價(jià)很大。我需要實(shí)現(xiàn)恒定的時(shí)間查找以滿足性能要求。
我決定把字典分成兩個(gè)不同的dict,并在插入時(shí)執(zhí)行分支。然后我用ChainMap把這兩個(gè)dict組合在一起。這樣,我就可以在單個(gè)字典中保留最初的視圖——但也可以在固定時(shí)間內(nèi)查找每個(gè)單獨(dú)的字典。
總結(jié)
總而言之,我們一起看了ChainMap是什么,一些具體的使用示例,以及如何在現(xiàn)實(shí)生活中,性能關(guān)鍵的應(yīng)用程序中使用ChainMap。
如果您想了解更多關(guān)于Python的高性能數(shù)據(jù)容器的信息,請(qǐng)務(wù)必從Python的標(biāo)準(zhǔn)庫(kù)中collections模塊中查看其他出色類和函數(shù)。英文原文:https://blog.florimondmanca.com/a-practical-usage-of-chainmap-in-python
譯者:張新英
總結(jié)
以上是生活随笔為你收集整理的python map用法_Python中ChainMap的一种实用用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python字符串逆序_python之字
- 下一篇: python的合法名称_Python未定