[英]Recursive collections.defaultdict initialization
我的目標是,給定一個我稱之為datainit
的 python dict,創建一個遞歸的collections.defaultdict
,我稱之為data
,例如data
用datainit
初始化,並且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.