0

鉴于字典的这种结构:

{
   'property1': 'value1',
   'property2.property3': 'value2',
   'property2.property7': 'value4',
   'property4.property5.property6': 'value3',

}

需要转换成这样的样子:

{
   'property1': 'value1',
   'property2': { 
                'property3': 'value2',
                'property7': 'value4'
              },
   'property4': { 
                'property5': { 
                             'property6': 'value3'
                           }
              }
}

只是简单的例子。我希望看到最优化和最漂亮的解决方案。显然,它应该是以第一个字典作为输入并输出第二个字典的函数。

4

2 回答 2

1

Quick'n'dirty 解决方案。似乎有效,但如果有更简单的方法可以做到这一点,我不会感到惊讶。

from collections import defaultdict

def default():
    return defaultdict(default)

def convert(src):
    dest = default()
    for key, val in src.iteritems():
        cursor = dest
        path = key.split('.')
        for path_elem in path[:-1]:
            cursor = cursor[path_elem]
        cursor[path[-1]] = val
    return dest

def to_regular_dict(val):
    # optional, if you do not want to carry defaultdicts around
    if isinstance(val, defaultdict):
        return {key:to_regular_dict(val) for key, val in val.iteritems()}
    else:
        return val

src = {
   'property1': 'value1',
   'property2.property3': 'value2',
   'property2.property7': 'value4',
   'property4.property5.property6': 'value3',
}

print convert(src)
print to_regular_dict(convert(src))
于 2013-09-26T14:44:39.123 回答
1

正如我所说,很简单。

def transform(inp):
    destination = {}

    for key, value in inp.items():
        keys = key.split(".")
        d = destination
        for key in keys[:-1]:
            if key not in d:
                d[key] = {}    
            d = d[key]

        d[keys[-1]] = value

    return destination

去测试:

inp = {
   'property1': 'value1',
   'property2.property3': 'value2',
   'property2.property7': 'value4',
   'property4.property5.property6': 'value3',

}

output = transform(inp)

print output

{'property1': 'value1',
 'property2': {
    'property3': 'value2',
    'property7': 'value4'
}
,'property4': {
    'property5': {
        'property6': 'value3'
    }
}}
于 2013-09-26T14:44:47.343 回答