簡體   English   中英

使用重復鍵在python中創建嵌套字典

[英]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.

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