摘要:使用最近看到組內有小伙伴在處理在多個內順序查找元素的時候,用了,有意思。場景當用戶輸入一個產品的時候,你希望能正在出售的產品,或在已過期的產品中查找。
使用ChainMap
最近看到組內有小伙伴在處理在多個dict內順序查找元素的時候,用了ChainMap,有意思。場景: 當用戶輸入一個產品id的時候,你希望能正在出售的產品,或在已過期的產品中查找。
你可以實現:
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))
如果是不止已過期產品,希望在其他庫房的產品也能被查找,你可能還要在一個新的dict里面查找。
這不難實現,就是代碼看起來有點難看。
為何不試下ChainMap,用ChainMap可以這樣寫:
g_products = ChainMap(g_on_sale_products, g_expire_products) def get_product(id): return g_products.get(id)
ChainMap可以添加多個dict,相當于把你的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
這里傳入多個dict后,多個dict放在maps里,這里maps傳的是多個dict的引用,也就是它沒有拷貝內存。
那么它是如何查找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)
可以看到,當通過dict[key]的時候,它是從self.maps里的存的dict,從前往后找,初始化的時候,第一個dict先被查找,key不在第一個dict的時候,就會找下一個dict里查找。
不過它在修改的時候,是這樣做的
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))
也就是你修改其中一個key的時候,它會在第一個dict里面修改,刪除一個key時候也是。
所以一般使用ChainMap的時候,我覺得最好不要做修改,因為修改是基于你初始化的時候,傳入的dict的順序,每次如果初始化的時候,如果dict的順序不確定,你每次就不能確定會修改哪一個dict。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43610.html
摘要:問題現在有多個字典或者映射,你想將它們從邏輯上合并為一個單一的映射后執行某些操作,比如查找值或者檢查某些鍵是否存在。 問題 現在有多個字典或者映射,你想將它們從邏輯上合并為一個單一的映射后執行某些操作, 比如查找值或者檢查某些鍵是否存在。 解決方案 使用collections庫的ChainMap類,可以快速的將多個dict合并在一起 >>> from collections impor...
摘要:這里提示一下,有些函數對隊列進行操作,但返回值是,比如反轉隊列,將隊列中元素向右移位,尾部的元素移到頭部。比如字典中的鍵映射多個值輸出結果如下三用途創建命名字段的元組。四用途統計可哈希的對象。 本文將詳細講解collections模塊中的所有類,和每個類中的方法,從源碼和性能的角度剖析。 一個模塊主要用來干嘛,有哪些類可以使用,看__init__.py就知道 This module i...
摘要:這里提示一下,有些函數對隊列進行操作,但返回值是,比如反轉隊列,將隊列中元素向右移位,尾部的元素移到頭部。比如字典中的鍵映射多個值輸出結果如下三用途創建命名字段的元組。四用途統計可哈希的對象。 本文將詳細講解collections模塊中的所有類,和每個類中的方法,從源碼和性能的角度剖析。 一個模塊主要用來干嘛,有哪些類可以使用,看__init__.py就知道 This module i...
閱讀 984·2021-11-23 09:51
閱讀 3470·2021-11-22 12:04
閱讀 2716·2021-11-11 16:55
閱讀 2921·2019-08-30 15:55
閱讀 3222·2019-08-29 14:22
閱讀 3351·2019-08-28 18:06
閱讀 1240·2019-08-26 18:36
閱讀 2126·2019-08-26 12:08