簡體   English   中英

使用 defaultDict 等默認值初始化 OrderedDict 中不存在的鍵

[英]Initialize non existing keys in OrderedDict with default values like defaultDict

有什么方法可以使用默認值訪問 OrderedDict 中不存在的鍵,就像我們在 defaultDict 中所做的那樣

Ex.
od = OrderedDict({'a':1})
print(od['b'])  # Output: KeyError: 'b'

這是在下面的實現中拋出KeyError的真正問題

l =['a','b','c','b']
od = OrderedDict({})

for k in l:
    od[k] += 1 # KeyError

有意避免這種實現

for k in l:
    if k in od:
        od[k] += 1
    else:
        od[k] = 1

只需從OrderedDict繼承並重新定義__getitem__

from collections import OrderedDict


class OrderedDictFailFree(OrderedDict):
    def __getitem__(self, name):
        try:
            return OrderedDict.__getitem__(self, name)
        except KeyError:
            return None


od = OrderedDictFailFree({'a': 1})
print(od['b'])

例如,如果您正在尋找 0 作為任何不存在的鍵的默認值。 如果鍵是預定義的,那么您可以使用 setdefault()

from collections import defaultdict
od = defaultdict(lambda: 0, od )

正如Yevgeniy Kosmak 的回答所示,這當然是可行的。 但是,請記住,在 Python >=3.7(或者甚至 >=3.6,只要您使用默認的 CPython 實現)中,所有字典現在都保持插入順序 因此,如果您不需要與舊版本兼容,通常根本不需要使用 OrderedDict。 您可以簡單地使用 defaultdict,它會始終保持其鍵的順序。

看起來我們可以使用od.setdefault('b',0)雖然它不是那么優雅的解決方案。

od = OrderedDict({'a':1})
print(od.setdefault('b',0)) # od.get('b',0) could be used if intention is not to change od
l =['a','b','c','b','b']
od = OrderedDict({})

for k in l:   
    od[k] = od.setdefault(k,0) + 1 # set key to 0 if there in no key k and increment by 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM