簡體   English   中英

遞歸 collections.defaultdict 初始化

[英]Recursive collections.defaultdict initialization

我的目標是,給定一個我稱之為datainit的 python dict,創建一個遞歸的collections.defaultdict ,我稱之為data ,例如datadatainit初始化,並且data可以用任何缺少鍵的路徑進行擴展,如下圖所示

from collections import *
datainit={'number':1}
data =something_with(defaultdict(), datainit)
data['A']['B']['C']=3
#At this stage, I want:
#data['A']['B']['C'] ==3
#data['number'] == 1
#and nothing else.

例如,從空字典開始執行此操作的正常方法是:

nested_dict = lambda: defaultdict(nested_dict)
data = nested_dict()

試:

nested_dict = lambda: defaultdict(nested_dict, datainit)
data = nested_dict()

邏輯上會導致我的 datainit 為每個丟失的鍵復制:

>>> datainit={'number':1}
>>> nested_dict = lambda: defaultdict(nested_dict, datainit)
>>> data=nested_dict()
>>> data
defaultdict(<function <lambda> at 0x7f58e5323758>, {'number': 1})
>>> data['A']['B']['C']=2
>>> data
defaultdict(<function <lambda> at 0x7f58e5323758>, {'A': defaultdict(<function <lambda> at 0x7f58e5323758>, {'B': defaultdict(<function <lambda> at 0x7f58e5323758>, {'C': 2, 'number': 1}), 'number': 1}),
'number': 1})

所有這些都是有道理的,但是我該怎么做才能從初始字典開始,然后為每個缺少的鍵使用一個空字典? 我的something_with(defaultdict(), datainit)應該是something_with(defaultdict(), datainit)

可能很明顯,但我看不到它!

你有兩層; 頂級defaultdict ,必須有number鍵,以及一系列任意嵌套的字典,但不能。 你的錯誤是嘗試將這些視為一個,嘗試將'number'視為缺失值工廠應該處理的東西。

只需在頂級字典中設置number鍵即可。 只有一個這樣的鍵,有一個值,它應該由defaultdict()工廠處理。 工廠為任意丟失的鍵提供默認值, number不是任意鍵。

from collections import defaultdict

def topleveldict():
    nested_dict = lambda *a, **kw: defaultdict(nested_dict, *a, **kw)
    return nested_dict(number=1)  # or nested_dict({'number': 1})

data = topleveldict()

僅當您計划在代碼庫中的多個位置創建結構時,才需要topleveldict()函數。 如果只有一個這樣的對象或只有一個地方創建這些對象,那么只需內聯該函數中的代碼:

nested_dict = lambda *a, **kw: defaultdict(nested_dict, *a, **kw)
data = nested_dict(number=1)  # or nested_dict({'number': 1})

暫無
暫無

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

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