面试题目:

1. 用PYTHON实现一个扁平化的字典,如{'a': {'b': '1'}}扁平化处理后变成{'a.b': 1}?


解题思路:

1. 由于字典可能是无限嵌套的,所以第一印象就想到采用递归函数完成,由于扁平化数据需要零时存储以及永久存储,而字典在递归中是非常方便的,递归函数中只需要遍历字典元素如果子元素不是字典则计算扁平化字典的key然后记录,否则就继续递归此子元素,依次类推.


具体实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2016-12-24 17:32:54
# @Author  : 李满满 ([email protected])
# @Link    : http://xmdevops.blog.51cto.com/
# @Version : $Id$

from __future__ import absolute_import
# 说明: 导入公共模块
# 说明: 导入其它模块


def flat_dict(src_dict, res_dict):
    if not isinstance(src_dict, dict):
        return
    for key in src_dict:
        # 说明: 防止第一次零时数据中多加一个.
        cur = res_dict['_']
        if not cur:
            res_dict['_'] += key
        else:
            res_dict['_'] += '.{0}'.format(key)
        # 说明: 如果当前元素不是字典则记录它
        if not isinstance(src_dict[key], dict):
            res_dict.update({res_dict['_']: src_dict[key]})
            # 说明: 既然不是字典则可能需要遍历同级元素所以需要还原到加key之前的数据
            res_dict['_'] = res_dict['_'].rstrip('.{0}'.format(key))
            continue
        # 说明: 如果当前元素依然是字典则继续递归此元素
        flat_dict(src_dict[key], res_dict)


if __name__ == '__main__':
    # 说明: _中保存零时扁平化数据
    result = {'_': ''}
    manman = {'a': {'b': {'c': 1, 'd': 2}, 'x': 2}}
    flat_dict(manman, result)
    # 说明: 处理完后pop出_零时数据
    result.pop('_')
    print result