Flatten nested dictionaries, compressing keys

前端 未结 28 2906
遇见更好的自我
遇见更好的自我 2020-11-22 01:16

Suppose you have a dictionary like:

{\'a\': 1,
 \'c\': {\'a\': 2,
       \'b\': {\'x\': 5,
             \'y\' : 10}},
 \'d\': [1, 2, 3]}

Ho

28条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-22 01:35

    How about a functional and performant solution in Python3.5?

    from functools import reduce
    
    
    def _reducer(items, key, val, pref):
        if isinstance(val, dict):
            return {**items, **flatten(val, pref + key)}
        else:
            return {**items, pref + key: val}
    
    def flatten(d, pref=''):
        return(reduce(
            lambda new_d, kv: _reducer(new_d, *kv, pref), 
            d.items(), 
            {}
        ))
    

    This is even more performant:

    def flatten(d, pref=''):
        return(reduce(
            lambda new_d, kv: \
                isinstance(kv[1], dict) and \
                {**new_d, **flatten(kv[1], pref + kv[0])} or \
                {**new_d, pref + kv[0]: kv[1]}, 
            d.items(), 
            {}
        ))
    

    In use:

    my_obj = {'a': 1, 'c': {'a': 2, 'b': {'x': 5, 'y': 10}}, 'd': [1, 2, 3]}
    
    print(flatten(my_obj)) 
    # {'d': [1, 2, 3], 'cby': 10, 'cbx': 5, 'ca': 2, 'a': 1}
    

提交回复
热议问题