亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

使用ChainMap

EscapedDog / 3404人閱讀

摘要:使用最近看到組內(nèi)有小伙伴在處理在多個(gè)內(nèi)順序查找元素的時(shí)候,用了,有意思。場(chǎng)景當(dāng)用戶輸入一個(gè)產(chǎn)品的時(shí)候,你希望能正在出售的產(chǎn)品,或在已過期的產(chǎn)品中查找。

使用ChainMap

最近看到組內(nèi)有小伙伴在處理在多個(gè)dict內(nèi)順序查找元素的時(shí)候,用了ChainMap,有意思。場(chǎng)景: 當(dāng)用戶輸入一個(gè)產(chǎn)品id的時(shí)候,你希望能正在出售的產(chǎn)品,或在已過期的產(chǎn)品中查找。

你可以實(shí)現(xiàn):

g_expire_products = {
    1: {"name": "nike shoes", "price": 30}, 
    2: {"name": "box", "price": 2},
}
g_on_sale_products = {
    3: {"name": "adidas shoes", "price": 25},
    4: {"name": "tee", "price": 2},
}

def get_product(id):
    return g_on_sale_products.get(id, g_expire_products.get(id))
    

如果是不止已過期產(chǎn)品,希望在其他庫房的產(chǎn)品也能被查找,你可能還要在一個(gè)新的dict里面查找。

這不難實(shí)現(xiàn),就是代碼看起來有點(diǎn)難看。
為何不試下ChainMap,用ChainMap可以這樣寫:

g_products = ChainMap(g_on_sale_products, g_expire_products)

def get_product(id):
    return g_products.get(id)

ChainMap可以添加多個(gè)dict,相當(dāng)于把你的if-else判斷做了抽象。

ChainMap源碼

ChainMap源碼在這兒

可以看下__init__

def __init__(self, *maps):
    """Initialize a ChainMap by setting *maps* to the given mappings.
    If no mappings are provided, a single empty dictionary is used.
    """
    self.maps = list(maps) or [{}]          # always at least one map

這里傳入多個(gè)dict后,多個(gè)dict放在maps里,這里maps傳的是多個(gè)dict的引用,也就是它沒有拷貝內(nèi)存。

那么它是如何查找key的,我們來看下:

def __missing__(self, key):
    raise KeyError(key)

def __getitem__(self, key):
    for mapping in self.maps:
        try:
            return mapping[key]             # can"t use "key in mapping" with defaultdict
        except KeyError:
            pass
    return self.__missing__(key)            # support subclasses that define __missing__

def get(self, key, default=None):
    return self[key] if key in self else default

def __contains__(self, key):
    return any(key in m for m in self.maps)

可以看到,當(dāng)通過dict[key]的時(shí)候,它是從self.maps里的存的dict,從前往后找,初始化的時(shí)候,第一個(gè)dict先被查找,key不在第一個(gè)dict的時(shí)候,就會(huì)找下一個(gè)dict里查找。

不過它在修改的時(shí)候,是這樣做的

def __setitem__(self, key, value):
    self.maps[0][key] = value

def __delitem__(self, key):
    try:
        del self.maps[0][key]
    except KeyError:
        raise KeyError("Key not found in the first mapping: {!r}".format(key))

也就是你修改其中一個(gè)key的時(shí)候,它會(huì)在第一個(gè)dict里面修改,刪除一個(gè)key時(shí)候也是。

所以一般使用ChainMap的時(shí)候,我覺得最好不要做修改,因?yàn)樾薷氖腔谀愠跏蓟臅r(shí)候,傳入的dict的順序,每次如果初始化的時(shí)候,如果dict的順序不確定,你每次就不能確定會(huì)修改哪一個(gè)dict。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/43610.html

相關(guān)文章

  • Python每日一練0013

    摘要:?jiǎn)栴}現(xiàn)在有多個(gè)字典或者映射,你想將它們從邏輯上合并為一個(gè)單一的映射后執(zhí)行某些操作,比如查找值或者檢查某些鍵是否存在。 問題 現(xiàn)在有多個(gè)字典或者映射,你想將它們從邏輯上合并為一個(gè)單一的映射后執(zhí)行某些操作, 比如查找值或者檢查某些鍵是否存在。 解決方案 使用collections庫的ChainMap類,可以快速的將多個(gè)dict合并在一起 >>> from collections impor...

    sihai 評(píng)論0 收藏0
  • Python中collections模塊的使用

    摘要:這里提示一下,有些函數(shù)對(duì)隊(duì)列進(jìn)行操作,但返回值是,比如反轉(zhuǎn)隊(duì)列,將隊(duì)列中元素向右移位,尾部的元素移到頭部。比如字典中的鍵映射多個(gè)值輸出結(jié)果如下三用途創(chuàng)建命名字段的元組。四用途統(tǒng)計(jì)可哈希的對(duì)象。 本文將詳細(xì)講解collections模塊中的所有類,和每個(gè)類中的方法,從源碼和性能的角度剖析。 一個(gè)模塊主要用來干嘛,有哪些類可以使用,看__init__.py就知道 This module i...

    xorpay 評(píng)論0 收藏0
  • Python中collections模塊的使用

    摘要:這里提示一下,有些函數(shù)對(duì)隊(duì)列進(jìn)行操作,但返回值是,比如反轉(zhuǎn)隊(duì)列,將隊(duì)列中元素向右移位,尾部的元素移到頭部。比如字典中的鍵映射多個(gè)值輸出結(jié)果如下三用途創(chuàng)建命名字段的元組。四用途統(tǒng)計(jì)可哈希的對(duì)象。 本文將詳細(xì)講解collections模塊中的所有類,和每個(gè)類中的方法,從源碼和性能的角度剖析。 一個(gè)模塊主要用來干嘛,有哪些類可以使用,看__init__.py就知道 This module i...

    sf190404 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<