[英]Creating nested dictionary in python with repeating keys
我有以下字典:
d = {
'results.household.land_tenure_access_restitution.has_land_allocated_relation': ['false', 'true'],
"results.household.land_tenure_access_restitution.is_status_of_claim_required": ["false", "true"]
}
我需要創建以下內容:
d2 = {
'results': {
'household': {
'land_tenure_access_restitution': {
'is_status_of_claim_required': ['false', 'true'],
'has_land_allocated_relation': ['false', 'true']
}
}
}
}
我寫了以下代碼:
f = {}
g = {}
for key, value in d.iteritems():
print f
for n, k in enumerate(reversed(key.split('.'))):
if n == 0:
f = {k: d[key]}
else:
f = {k: f}
g.update(f)
但是,由於上級鍵不是唯一的,因此詞典將被最新的鍵值覆蓋。 我得到以下輸出:
{
'results': {
'household': {'land_tenure_access_restitution': {
'has_land_allocated_relation': ['false', 'true']
}}}}
如何達到上述效果?
您可以遞歸合並字典:
from functools import reduce
import collections
d = {
'results.household.land_tenure_access_restitution.has_land_allocated_relation': ['false', 'true'],
"results.household.land_tenure_access_restitution.is_status_of_claim_required": ["false", "true"]
}
def dict_merge(dct, merge_dct):
for key, value in merge_dct.items():
if key in dct and isinstance(dct[key], dict) and isinstance(merge_dct[key], collections.Mapping):
dict_merge(dct[key], merge_dct[key])
else:
dct[key] = merge_dct[key]
result = {}
for k, v in d.items():
elements = [v] + list(reversed(k.split('.')))
nested = reduce(lambda x, y: {y: x}, elements)
dict_merge(result, nested)
print(result)
產量
{'results': {'household': {'land_tenure_access_restitution': {'has_land_allocated_relation': ['false', 'true'], 'is_status_of_claim_required': ['false', 'true']}}}}
函數dict_merge
遞歸合並兩個字典,這些行:
elements = [v] + list(reversed(k.split('.')))
nested = reduce(lambda x, y: {y: x}, elements)
為原始詞典的每個鍵創建一個嵌套詞典。
您的更新過程太遲了:請注意,只有在遍歷整個字符串並且返回到dict的頂層時,更新才可能發生。 只要根匹配,就替換整個樹。
您需要從樹的根results
開始,然后向下遍歷,直到檢測到需要更新為止,即現有結構與當前字符串之間的差異。 然后 ,解析剩余的字符串並構建要添加的子樹,並在到達字符串末尾時進行更新。
這是否足夠提示您進行編碼?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.